Valgrind:条件跳转或移动取决于未初始化的值,即使我初始化内存
Posted
技术标签:
【中文标题】Valgrind:条件跳转或移动取决于未初始化的值,即使我初始化内存【英文标题】:Valgrind : Conditional jump or move depends on uninitialised value(s) occurs even I initializing the memory 【发布时间】:2018-08-16 15:21:07 【问题描述】:我很难解决这个问题。 在我初始化分配的内存后,valgrind 说“条件跳转或移动取决于未初始化的值”。
所以,这是我的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
int st_a;
int st_b;
char st_c:
char st_d:
TEST_ST;
int inner_func(int *a, TEST_ST *st_a)
//memset(st_a, 0, sizeof(TEST_ST));
if(a[0] > 0)
printf("inner_func: bigger than zero\n");
else
printf("inner_func: else\n");
st_a->st_a = 1;
int main()
int *a;
int *b;
TEST_ST *st_a;
a = (int *)malloc(sizeof(int) * 10);
b = (int *)malloc(sizeof(int) * 10);
memset(a, 0, sizeof(int) * 10);
//memset(b, 0, sizeof(int) * 10);
st_a = (TEST_ST *)malloc(sizeof(TEST_ST));
a[0] = 1;
if(a[9] > 0)
printf("Bigger than zero\n");
else
printf("Smaller than zero or equal\n");
inner_func(b, st_a);
free(st_a);
free(b);
free(a);
return 0;
这是一个 valgrind 日志。
我不明白为什么 valgrind 会像图片中的第一行那样说。
有人可以帮帮我吗?
【问题讨论】:
贴出的代码无法编译!除其他外,此语句:char st_c:
以冒号 :
而不是分号 ;
结尾请更正,不要重新键入代码,而是执行复制和粘贴
你可能想使用calloc()
而不是malloc()
,那么分配的内存将已经被初始化为0x00
【参考方案1】:
您正在读取的值实际上并未初始化。
有问题的行在函数inner_func
中:
if(a[0] > 0)
a
作为函数的参数,调用方式如下:
inner_func(b, st_a);
所以函数中的a
与main
中的b
相同。 b
指向 malloc
返回的内存,但该内存从未初始化。
取消注释您在b
上调用memset
的行。
【讨论】:
感谢您的回答。我找不到我的错误! @Youngmin 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer。【参考方案2】:像这样运行 valgrind 并发布结果,我将用答案进行编辑,但这应该指出错误在哪里:
valgrind --tool=memcheck --track-origins=yes <program_path>
【讨论】:
【参考方案3】:您已分配“char st_c:”和“char st_d:”将其更改为 ';'而不是':'
【讨论】:
以上是关于Valgrind:条件跳转或移动取决于未初始化的值,即使我初始化内存的主要内容,如果未能解决你的问题,请参考以下文章