c - Valgrind:条件跳转或移动取决于未初始化的值,即使我初始化内存
问题描述
我很难解决这个问题。在我初始化分配的内存后,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 会像图片中的第一行那样说。
任何人都可以帮助我吗?
解决方案
您正在读取的值实际上并未初始化。
有问题的行在函数中inner_func
:
if(a[0] > 0)
is 作为函数的a
参数,它的调用方式如下:
inner_func(b, st_a);
所以a
in 功能和b
in一样main
。 b
指向由 返回的内存malloc
,但该内存从未初始化。
取消注释您调用的memset
行b
。
推荐阅读
- javascript - 如何从 Javascript 中的颜色图生成颜色?
- botframework - 我如何在扩展消息上制作此标签
- python - Python Pandas 中 DataFrame 中的日期操作?
- javascript - 刷新页面后如何在表格中显示保存的数据
- r - 将两个二进制列合并为一个保留二进制选项
- symfony - 实体关系 OneToMany 只获得一条记录.. 但许多人期望
- javascript - 在 JavaScript 中调用其中的某个函数时,只获取 for 循环中的第一个键
- kotlin - 在 Kotlin 中找到两个集合之间的对称差
- javascript - 尝试使用 react-leaflet-choropleth 映射 choropleth 时出错:无法读取未定义的属性“map”
- sql - 有没有办法根据其他 DISTINCT 列在一个列上选择总和,同时仅按第三列(日期)分组