Освобождение двумерных массивов в C. "двойное освобождение или повреждение" и "неверный следующий размер"

Так что у меня проблемы с памятью при использовании gcc.

У меня есть этот 2D-массив внутри структуры. Я пытаюсь сделать этот код на C немного проще для себя с помощью объектно-ориентированного программирования.

Что, кажется, проблема здесь. Всякий раз, когда я пытаюсь free_Foo, я сталкиваюсь с "Ошибка в`./Foo': двойное освобождение или повреждение (нет): 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 ответ

Изменить это утверждение

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
}
Другие вопросы по тегам