1

我得到这个 Valgrind 输出(这是我得到的唯一错误):

==20627== Conditional jump or move depends on uninitialised value(s)
==20627==    at 0x804913A: main (main.c:223)

我的main.c大致是这样的:

//other code

char **sets;

//other code

//char** get_char_sets(FILE *source);
sets = get_char_sets(config_file); // I malloc the sets in here

//other code

int i = 0;
while(sets[i]){ // line 223
    free(sets[i]);
    i++;
}
free(sets);

//other code

get_char_sets看起来像这样:

char** get_char_sets(FILE *source){

    char **sets = malloc((n + 1) * sizeof(char*));

    for(int i=0;i<=n;i++){
        sets[i] = malloc(1 * sizeof(char));
    }

    //rest of function

    return sets;
}

我知道 valgrind 说我正在使用一个未初始化的变量,我唯一能看到的是sets,但它被malloc()编辑get_char_sets()并分配了返回的指针。

我怎样才能摆脱那个 valgrind 错误以更正我的代码?

4

3 回答 3

4
while(sets[i]) { // line 223
    free(sets[i]);
    i++;
}

在某个时候,分配的集合将结束。然后sets[i]将指向分配的内存之外,指向您未设置的内容。

鉴于您的其余代码,您可以像这样修复它:

for(int i = 0; i < n; i++) /* Note < instead of <=. */
    sets[i] = malloc(1);

size[n] = NULL; /* Add terminator marker. */
于 2012-04-24T15:00:09.347 回答
4

的值没有限制i,最终会导致越界:

while(sets[i]){

更改为(类似于):

int i = 0;
while(i <= n && sets[i]){ /* Ensure check i <= n before accessing sets */
    free(sets[i]);
    i++;
}
free(sets);

您还可以在其中添加一个NULL哨兵值sets,并且while原样就可以了。

于 2012-04-24T15:00:27.367 回答
3

你们mallocn+1分配char*sets,

for(int i=0;i<=n;i++){
    sets[i] = malloc(1 * sizeof(char));
}

因此,除非malloc失败,否则它们都是非NULL. 但是然后你继续free直到你找到一个NULL

int i = 0;
while(sets[i]){ // line 223
    free(sets[i]);
    i++;
}

它将访问分配的(到sets)内存的末尾,从而调用未定义的行为。

于 2012-04-24T15:02:12.647 回答