Valgrind:未初始化的值是由堆分配 (malloc) 创建的

Valgrind: Uninitialised value was created by a heap allocation (malloc)

我试图找出以下代码中的错误。当我 运行 使用 Valgrind 的程序时,我收到错误说明。未初始化的值是由堆分配 (malloc) 创建的


    int main(){

    int **point;
    int val=3;
    int i;
    int j;

    point=malloc(sizeof(int*)*val);

    for(i=0;i<val;i++){
        point[i]=malloc(sizeof(int)*4);
    }
    for(i=0;i<val;i++){
        for(j=0;j<4;j++){
            point[i][j]=point[i][j]+i*j+val;
        }
}

您使用了值 point[i][j] 而未在此处初始化:

        point[i][j]=point[i][j]+i*j+val;

通过 malloc() 分配的缓冲区的初始值是不确定的,使用该值会调用 未定义的行为

您可以使用 calloc() 而不是 malloc() 来将分配的缓冲区初始化为零:

for(i=0;i<val;i++){
    point[i]=calloc(4, sizeof(int));
}

另一种方法是手动初始化缓冲区:

for(i=0;i<val;i++){
    point[i]=malloc(sizeof(int)*4);
    for(j=0;j<4;j++){
        point[i][j]=0; /* or put what you like */
    }
}

您最初引用的 valgrind 消息部分只是告诉您未初始化内存的分配位置。您现在发布的完整消息告诉您未初始化值的使用位置:

for(i=0;i<val;i++){
    for(j=0;j<4;j++){
        point[i][j]=point[i][j]+i*j+val;
    }
}

您正在阅读尚未初始化的 point[i][j]