2012-05-06 43 views
1

当我对以下(示例)代码运行valgrind时,它报告“Invalid free()/ delete/delete []”和Invalids读取。我真的不明白为什么。有人可以解释一下吗?为什么Valgrind在realloc()之后报告无效的free()?

编辑:感谢您的回复,现在非常明显。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h 

void vl_dec(char* a) { 
    char* str = a; 
    while (*(str+1) != '\0') str++; 
    while(*str == '0') { 
    *str = '9'; 
    str--; 
    } 
    (*str)--; 

    if (*a == '0') { 
    memmove(a, a+1, strlen(a)); 
    a = (char*)realloc(a, (strlen(a)+1)*sizeof(char)); 
    if (a == NULL) { 
     fprintf(stderr, "Cannot allocate memory\n"); 
     exit(1); 
    } 
    } 
} 

int main(int argc, char* argv[]) { 
    char* a = (char*)malloc(6*sizeof(char)); 
    if (a == NULL) { 
    fprintf(stderr, "Cannot allocate memory\n"); 
    exit(1); 
    } 
    strcpy(a, "10000"); 
    vl_dec(a); 
    printf("%s\n", a); 
    free(a); 
    return 0; 
} 

回答

3

在你的函数main,你是按值传递avl_dec,所以它永远不会被更新 - 的realloc结果只存储在失去了当vl_dec返回一个局部变量。相反,通过其地址:

void vl_dec(char ** a) { *a = realloc(...); } 

int main() 
{ 
    char * a = malloc(...); 
    vl_dec(&a); 
    free(a); 
} 
1

你不能只是假设,arealloc回报的新的价值是一样的旧值。实际上你必须更新指针的使用位置。我怀疑你知道,因为你正确保存的vl_dec内的realloc返回值,但是你忘记了你需要返回的avl_dec新值(或使用char**作为参数设置为vl_dec更新。)

0

因为您将值指针传递给vl_dec,而不是通过引用。

如果你realloc指针在vl_dec内你的主函数仍然会看到在main中声明的原始指针。指针无效后realloc,所以valgrind抱怨。

解决此问题的简单方法是重写vl_dec并让它返回指针。这样你可以打电话:

a = vl_dec(a); 

主要和问题解决了。

相关问题