【问题标题】:Valgrind: Uninitialised value was created by a heap allocation (malloc)Valgrind:未初始化的值是由堆分配(malloc)创建的
【发布时间】:2021-03-23 14:51:27
【问题描述】:

我正在尝试在以下代码中查找错误。当我使用 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;
        }
}

【问题讨论】:

  • 您发布的程序看起来不错,只是缺少所需的标头并且未释放分配的内存。问题应该是在最初遵循的代码中使用已分配和未初始化的数据。请发帖Minimal, Reproducible Example
  • 这在第 13 行结束,是否有任何额外的内容(如任何包含的标题)未包含在此处?
  • posted 代码是否产生了指定的错误?如果不是,则不能考虑minimal reproducible example
  • 请注意,valgrind 通常会报告访问未初始化值的行,以及分配内存的行。看起来您可能专注于第二个,但您忽略了第一个(这可能是在这一点之后,在您没有显示的代码中)。
  • Valgrind 告诉我...”最好发布 Valgrind 给出的完整信息。

标签: c valgrind


【解决方案1】:

您使用的值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 */
    }
}

【讨论】:

    【解决方案2】:

    您最初引用的 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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 2021-06-14
      • 1970-01-01
      相关资源
      最近更新 更多