条件跳转或移动取决于未初始化的值2D阵列

时间:2012-12-02 22:25:26

标签: c valgrind

嗨,我有这个问题:

tmpy = (int**)realloc(os,y*sizeof(int*));
os = tmpy;
tmpy=NULL;
for(i=0;i<y;i++) {
    tmpx = (int*)realloc(os[i],x*sizeof(int)); 
    os[i] = tmpx;
    tmpx=NULL;
}

程序运行良好,但valgrind给出了这个错误:

==12513== Conditional jump or move depends on uninitialised value(s)
==12513==    at 0x402BF0D: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==12513==    by 0x8048760: main (main.c:55)
==12513==  Uninitialised value was created by a heap allocation
==12513==    at 0x402BF52: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==12513==    by 0x804871E: main (main.c:50)
==12513== 

有什么问题?谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

假设osrealloc() d更大,那么有效添加到int*的其他os将是未初始化的指针(由os[i]访问)。这些单元化指针最终传递到realloc()循环中的for

tmpx = (int*)realloc(os[i],x*sizeof(int));

传递给realloc()的指针必须是NULLmalloc()realloc()calloc()之前返回的值。在进入int*循环之前,将其他NULL设置为for。请注意,realloc()的返回值的强制转换是不需要的。