C 未初始化的值是由堆分配创建的,用于分配结构数组
Valgrind在抱怨一种方法,我真的不明白为什么。我收到的错误消息如下: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
==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。你使用三个变量,而你只需要一个。同意约普的说法:我不明白你想做什么为什么这很重要?如果我用复杂或不复杂的方式做这件事。。当我这样做的时候,我没有得到更好的方法,就像我说的:我检查列表中有多少个元素是连续的,意思是开始+长度等于下一个元素的开始,然后我保存最后一个连续元素的索引,并生成一个元素而不是所有的连续元素