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]
。
我试图找出以下代码中的错误。当我 运行 使用 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]
。