Valgrind:即使我初始化内存,条件跳转或移动也取决于未初始化的值

1 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;
}
Run Code Online (Sandbox Code Playgroud)

这是一个valgrind日志.

我不明白为什么valgrind说的像图中的第一行.

有人可以帮帮我吗?

dbu*_*ush 5

您正在阅读的值实际上并未初始化.

有问题的行在函数中inner_func:

if(a[0] > 0)
Run Code Online (Sandbox Code Playgroud)

的a是参数的功能,这被称为是这样的:

inner_func(b, st_a);
Run Code Online (Sandbox Code Playgroud)

所以a在功能上是一样b的main. b指向返回的内存malloc,但该内存从未初始化.

取消注释,您呼叫的线路memset上b.