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);

所以函数中的amain 中的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:条件跳转或移动取决于未初始化的值,即使我初始化内存的主要内容,如果未能解决你的问题,请参考以下文章

条件跳转问题

Valgrind:致命错误:memcheck.h:没有这样的文件或目录

分段错误:C ++ IntVector中为11

与opencv链接时内存泄漏

Valgrind:禁用条件跳转(或整个库)检查

ubuntu上的静态链接pthread导致未初始化的值跳转(valgrind)[重复]