Освобождение двумерных массивов в 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
}