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

标签 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== 

出了什么问题?感谢您的帮助。

最佳答案

假设 osrealloc() 调整为更大的大小,则附加的 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/

相关文章:

c - 将二维数组传递给函数

python - 在 cython 中使用 typedef'd 结构

c - 为什么 valgrind 的堆栈跟踪分为两部分?

java - Valgrind 检测 Java Web 应用程序中的内存泄漏

c - valgrind 说我有条件跳跃或移动取决于初始化值

c - 如果我们首先在 if 或 while 中使用 fork() 为什么会返回双零

c - 如何在 C 中取消引用和自动递增强制转换指针?

c - 为什么这个字符串反转 C 代码会导致段错误?

c++ - 这个 valgrind 错误是什么意思?

c - 使用 strcpy 到 calloc 位置时大小为 1 的写入无效