首页 > 解决方案 > 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 会像图片中的第一行那样说。

任何人都可以帮助我吗?

标签: cvalgrind

解决方案


您正在读取的值实际上并未初始化。

有问题的行在函数中inner_func

if(a[0] > 0)

is 作为函数的a参数,它的调用方式如下:

inner_func(b, st_a);

所以ain 功能和bin一样mainb指向由 返回的内存malloc,但该内存从未初始化。

取消注释您调用的memsetb


推荐阅读