Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分离函数中的Malloc值导致;在该函数中未初始化;_C_Variables_Malloc_Warnings_Compiler Warnings - Fatal编程技术网

分离函数中的Malloc值导致;在该函数中未初始化;

分离函数中的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) {

为了简化我的代码,我认为我应该聪明地将一个函数中的所有变量放在一个单独的函数中,以删除大的代码块。但是,当我尝试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
是原始poitner的副本,它只包含
main()
中原始指针的相同地址,但它自己的地址不同,因此修改它的值不会修改
main()中指针的值

你有两个选择

  • 将poitner的地址传递给
    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);}