试图简化我的代码,我认为将一个函数中的所有变量放入一个单独的函数中以删除大的代码块是明智的。然而,当我尝试对一些变量进行malloc时,编译器返回:
警告:在此函数中未初始化就使用了"roomString"[-Wuninitialized]
以下是缩写代码:
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
是原始指针的副本,它只是在main()
点中也包含原始指针的相同地址,但它自己的地址不同,所以修改它的值不会修改main()
中指针的值。
你有两个选项
像这个一样将poitner的地址传递给
mallocBoard()
void mallocBoard(char ***pointer, size_t size) { *pointer = malloc(sizeof(char *) * size); }
然后从CCD_ 11
mallocBoard(&roomString, someSize);
这将修改原始指针的值。
像这个一样从
mallocBoard()
返回新的malloc()
ed指针char **mallocBoard(size_t size) { return malloc(sizeof(char *) * size); }
然后在CCD_ 14 中
roomString = mallocBoard(someSize);
main中的roomString
传递给mallocBoard
时,会创建变量roomString
的副本,并将其放入mallocBoard
的参数中。然后,当调用malloc时,malloc返回的指针值被存储到与main方法中的变量roomString
不同的局部变量roomString
中,并且main中的roomString
值从不初始化。
为了解决这个问题,最好不要将对malloc
的调用放在它自己的函数中,因为(1)这个函数的用途有限,在代码的其他地方不太可能需要:它只分配一个集合大小的字符指针数组,(2)每次调用一个函数(将参数放在堆栈上,保存返回地址等)都会有一些开销,所以仅仅为了执行一行代码而调用一个功能可能是不值得的。
此外,malloc
返回一个指向void
的指针,因此最好将malloc
返回的值显式强制转换为您想要的类型:roomString = (char **) malloc(sizeof(char*) * PARSEBUFF);