C 未初始化的值是由堆分配创建的,用于分配结构数组

C 未初始化的值是由堆分配创建的,用于分配结构数组,c,valgrind,C,Valgrind,Valgrind在抱怨一种方法,我真的不明白为什么。我收到的错误消息如下: ==1664== Uninitialised value was created by a heap allocation ==1664== at 0x47F1: malloc (vg_replace_malloc.c:302) ==1664== by 0x100004B6A: filter_my_struct_list (main.c:3357) ==1664== by 0x100002C7C: m

Valgrind在抱怨一种方法,我真的不明白为什么。我收到的错误消息如下:

==1664==  Uninitialised value was created by a heap allocation
==1664==    at 0x47F1: malloc (vg_replace_malloc.c:302)
==1664==    by 0x100004B6A: filter_my_struct_list (main.c:3357)
==1664==    by 0x100002C7C: main (main.c:370)
在这个方法中,他抱怨我只是试图压缩一个列表,也就是说,我正在将结构中的连续元素合并到一个列表中

my_struct只是一个具有两个int值的结构:

typedef struct {
   int start;
   int len;
} my_struct;
方法如下所示:

 my_struct* filter_my_struct_list(my_struct *listl, int *elements_in_list) {

my_struct *compressed_list;
if (*elements_in_list == 0) {
    fprintf(stderr, "Number of my_structs should not be zero! Please check the      input!\n");
    exit(1);
} else if (*elements_in_list == 1) {
    compressed_list = malloc(sizeof(my_struct)* 1);
    my_struct f = {listl[0].start, listl[0].len};
    compressed_list[0] = f;
    return compressed_list;
}

int fst, remained_index;
remained_index = fst = 0;

compressed_list = malloc(sizeof(my_struct) * (*elements_in_list)); //<== The line valgrind doesn't like

while (fst < (*elements_in_list - 1)) {

    int fst_in_loop = fst;
    int nxt = fst_in_loop + 1;
    BOOL terminate = FALSE;

    while (!terminate) {

        if (((listl[fst_in_loop].start + listl[fst_in_loop].len) == listl[nxt].start)) {
            fst_in_loop++;
            nxt++;
        } else terminate = TRUE;

        if (nxt == (*elements_in_list)) {
            terminate = TRUE;
        }
    }

    if (fst_in_loop != fst) {

        int new_len = listl[fst_in_loop].start
                + listl[fst_in_loop].len - listl[fst].start;

        my_struct f = {listl[fst].start, new_len};
        compressed_list[remained_index] = f;

    } else {
        my_struct f = {listl[fst].start, listl[fst].len};
        compressed_list[remained_index] = f;
    }

    remained_index++;
    fst = nxt;
    if (nxt == (*elements_in_list - 1)) {

        if (fst == fst_in_loop) {

            int f_1;
            for (f_1 = fst; f_1 <= nxt; f_1++) {
                my_struct f = {listl[f_1].start, listl[f_1].len};
                compressed_list[remained_index] = f;
                remained_index++;
            }

        } else {
            my_struct f = {listl[nxt].start, listl[nxt].len};
            compressed_list[remained_index] = f;
            remained_index++;
        }
    }
}
*elements_in_list = remained_index;
return compressed_list;
}

为什么他告诉我它没有初始化,因为我正在抓到的情况下,有不到两个元素要合并

编辑:


好的,我刚刚发现,当我只调用这个方法时,错误消失了,但只要我重新使用我的列表,错误就会出现

请在代码中指出行号-即valgrindsorry指示的编号为3172和3358的行,我删除了alloc,这是一个不重要的malloc宏,我指出了问题所在的行;但是请看我的第二篇文章,这里有我的实际问题fst\u in_loop=fst;int nxt=fst\u in\u循环+1;BOOL终止=假;是一种非常复杂的方法来比较两个相邻的元素,IMHO。你使用三个变量,而你只需要一个。同意约普的说法:我不明白你想做什么为什么这很重要?如果我用复杂或不复杂的方式做这件事。。当我这样做的时候,我没有得到更好的方法,就像我说的:我检查列表中有多少个元素是连续的,意思是开始+长度等于下一个元素的开始,然后我保存最后一个连续元素的索引,并生成一个元素而不是所有的连续元素