c语言 - 单独函数中的马洛克可值导致"uninitialized in this function"



试图简化我的代码,我认为将一个函数中的所有变量放入一个单独的函数中以删除大的代码块是明智的。然而,当我尝试对一些变量进行malloc时,编译器返回:

警告:在此函数中未初始化就使用了"roomString"[-Wuninitialized]

以下是缩写代码:

int main(){
    char ** roomString;
    mallocBoard(roomString);
    return 0;
}
void mallocBoard(char ** roomString)
{
    roomString = malloc(sizeof(char *) *PARSEBUFF);
}

只是想知道为什么它会返回警告?有更好的方法吗?

这是因为roomStringmain()中未初始化。

当您将roomString指针传递到mallocBoard函数时,它不会覆盖poitner中存储的地址,而是覆盖传递给mallocBoard()的本地指针中存储的那个地址,这是因为在c中,您总是按值传递变量。

我的意思是,在mallocBoard()中作为参数接收的roomString是原始指针的副本,它只是在main()点中也包含原始指针的相同地址,但它自己的地址不同,所以修改它的值不会修改main()中指针的值。

你有两个选项

  1. 像这个一样将poitner的地址传递给mallocBoard()

    void mallocBoard(char ***pointer, size_t size)
     {
        *pointer = malloc(sizeof(char *) * size);
     }
    

    然后从CCD_ 11

    mallocBoard(&roomString, someSize);
    

    这将修改原始指针的值。

  2. 像这个一样从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);

相关内容

  • 没有找到相关文章

最新更新