您好,我遇到了问题:
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==
出了什么问题?感谢您的帮助。
最佳答案
假设 os
被 realloc()
调整为更大的大小,则附加的 int*
有效地添加到 os
将是未初始化的指针(通过 os[i] 访问)。这些统一的指针最终会在 for
循环中传递给 realloc()
:
tmpx = (int*)realloc(os[i],x*sizeof(int));
传递给 realloc()
的指针必须为 NULL
或之前由 malloc()
、realloc() 返回的值
或 calloc()
。在进入 for
循环之前,将附加的 int*
设置为 NULL
。请注意,不需要对 realloc()
返回值进行强制转换。
关于条件跳转或移动取决于未初始化的值 2D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13674599/