分离函数中的Malloc值导致;在该函数中未初始化;
为了简化我的代码,我认为我应该聪明地将一个函数中的所有变量放在一个单独的函数中,以删除大的代码块。但是,当我尝试malloc一些变量时,编译器返回: 警告:“roomString”在此函数中未初始化使用 [-Wuninitialized] 以下是缩短的代码:分离函数中的Malloc值导致;在该函数中未初始化;,c,variables,malloc,warnings,compiler-warnings,C,Variables,Malloc,Warnings,Compiler Warnings,为了简化我的代码,我认为我应该聪明地将一个函数中的所有变量放在一个单独的函数中,以删除大的代码块。但是,当我尝试malloc一些变量时,编译器返回: 警告:“roomString”在此函数中未初始化使用 [-Wuninitialized] 以下是缩短的代码: int main(){ char ** roomString; mallocBoard(roomString); return 0; } void mallocBoard(char ** roomString) {
int main(){
char ** roomString;
mallocBoard(roomString);
return 0;
}
void mallocBoard(char ** roomString)
{
roomString = malloc(sizeof(char *) *PARSEBUFF);
}
只是想知道为什么它会返回一个警告?有更好的方法吗?这是因为
roomString
在main()
中未初始化
当您将roomString
指针传递给mallocBoard
函数时,它不会覆盖poitner中的地址,而是存储在传递给mallocBoard()
的本地指针中的地址,这是因为在c中,总是按值传递变量
我的意思是,在mallocBoard()
中作为参数接收的roomString
是原始poitner的副本,它只包含main()
中原始指针的相同地址,但它自己的地址不同,因此修改它的值不会修改main()中指针的值
你有两个选择
mallocBoard()
,如下所示
void mallocBoard(char ***pointer, size_t size)
{
*pointer = malloc(sizeof(char *) * size);
}
char **mallocBoard(size_t size)
{
return malloc(sizeof(char *) * size);
}
然后从main()
这将修改原始指针的值mallocBoard()
返回新的malloc()
ed指针,如下所示
void mallocBoard(char ***pointer, size_t size)
{
*pointer = malloc(sizeof(char *) * size);
}
char **mallocBoard(size_t size)
{
return malloc(sizeof(char *) * size);
}
然后在main()
将main中的
roomString
传递给mallocBoard
时,将创建变量roomString
的副本,并将其放入mallocBoard
的参数中。然后,当调用malloc时,malloc返回的指针值存储在局部变量roomString
中,该变量与main方法中的变量roomString
不同,main中的roomString
值从未初始化
为了解决这个问题,最好不要将对malloc
的调用放在它自己的函数中,因为(1)这个函数的使用有限,并且不太可能在代码的其他地方需要:它只分配一个设置大小的字符指针数组,(2)每次调用函数时都会有一些开销(将参数放在堆栈上,保存返回地址等),因此调用函数仅仅执行一行可能不值得
另外
malloc
返回一个指向void
的指针,因此最好将malloc
返回的值显式转换为您想要的类型:roomString=(char**)malloc(sizeof(char*)*PARSEBUFF);
显然您需要***
树星…或者只是char mallocBoard(size\t size){返回malloc(sizeo(char*)*size);}