在C中释放2D数组“双重自由或腐败”和“无效的下一个大小”

时间:2014-08-14 22:27:38

标签: c arrays memory-management malloc free

所以我使用gcc时出现内存问题。

我在结构中有这个2D数组。我试图通过面向对象的编程使自己的C代码更容易一些。

这里似乎有什么问题。每当我尝试free_Foo时,我都会遇到“./Foo”中的错误:双重释放或损坏(out):0x0000000001713050 *

typedef struct {
    char** map;
    int height;
    int width;
} Foo;

Foo* init_Foo(int width, int height){
    Foo* f = (Foo*) malloc (sizeof(*f));

    char** map;
    map = (char**) malloc (height* sizeof(**map));
    int i;  
    for ( i = 0; i < height; i++){
        map[i] = (char*) malloc(width * sizeof(*map));  
    }

    f->map = map;
    f->height = height;
    f->width = width;

    return f;
}


void free_Foo(Foo* f){
    int i;  
    for ( i = 0; i < f->height; i++){
        free(f->map[i]);
    }
    free(f->map);
    free(f);
}

1 个答案:

答案 0 :(得分:1)

更改此声明

map = (char**) malloc (height* sizeof(**map));

map = (char**) malloc (height* sizeof( *map));

相应地这句话

for ( i = 0; i < height; i++){
    map[i] = (char*) malloc(width * sizeof(*map));  
}

for ( i = 0; i < height; i++){
    map[i] = (char*) malloc(width * sizeof(**map));  
}

表达式**map的类型为char,而*map的类型为char *

所以你可以改为写

map = (char**) malloc (height* sizeof( char * )); // *map

for ( i = 0; i < height; i++){
    map[i] = (char*) malloc(width * sizeof( char ));   // **map
}