单独函数中的 Malloc 变量导致 "uninitialized in this function"

Malloc vairables in seperate function results in "uninitialized in this function"

试图简化我的代码,我认为通过将一个函数中的所有变量分配到一个单独的函数中以删除大代码块,我会很聪明。但是,当我尝试 malloc 一些变量时,编译器 returns:

warning: ‘roomString’ is used uninitialized in this function [-Wuninitialized]

这是缩短的代码:

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

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

因为roomStringmain()中没有初始化。

当您将 roomString 指针传递给 mallocBoard 函数时,它不会覆盖存储在指针中的地址,而是覆盖存储在传递给 [=18= 的本地指针中的地址] 那是因为在 c 中你总是按值传递变量。

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

中指针的值

您有 2 个选择

  1. 像这样把指针的地址传给mallocBoard()

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

    然后从main()

    mallocBoard(&roomString, someSize);
    

    即会修改原指针的值

  2. Return 来自 mallocBoard() 的新 malloc()ed 指针像这样

    char **mallocBoard(size_t size)
     {
        return malloc(sizeof(char *) * size);
     }
    

    然后在 main()

    roomString = mallocBoard(someSize);
    

当 main 中的 roomString 传递给 mallocBoard 时,会创建变量 roomString 的副本并将其放入 mallocBoard 的参数中。然后,在调用malloc时,将mallocreturn后的指针值存入局部变量roomString,与main方法中的变量roomString不同, main 中的 roomString 值从未初始化。

要解决这个问题,最好不要将对 malloc 的调用放在它自己的函数中,因为 (1) 这个函数的用途有限,不太可能在代码的其他地方用到:它只分配一个设置大小的字符指针数组,并且(2)每次调用函数时都会有一些开销(将参数放在堆栈上,保存 return 地址等)所以它可能不值得它调用一个函数只是为了执行一行。

也是 malloc return 指向 void 的指针,因此最好将 malloc 编辑的值 return 显式转换为您想要的类型想要:roomString = (char **) malloc(sizeof(char*) * PARSEBUFF);