В настоящее время я работаю над структурами для личного проекта.Я пытаюсь использовать динамически распределяемые двумерные массивы, а затем освобождаю пространство, которое они занимают.Произошла ошибка при попытке освободить выделенное пространство.
Мне удалось сузить источник проблемы до функции, которую я настроил для разрушения своих структур, но не смог точно определитьпричина ошибки внутри.Еще более важным является тот факт, что ошибка, нарушение прав доступа, срабатывает только в половине случаев.Я включил функции ниже, с несколькими комментариями.Извините, если я включил здесь слишком много кода, но я искренне растерялся в словах и чувствую, что способ инициализации структур может повлиять на то, правильно ли я их уничтожаю.
#include <stdio.h>
#include <stdlib.h>
typedef struct f_part f_part;
typedef struct field field;
//these are the structures I used:
//part of a field: includes a character and a color
struct f_part
{
char caractere;
short int color;
};
//field: points to a bidimensionnal array of f_part, and remember its size
struct field
{
int fsize_x;
int fsize_y;
f_part **fbody;
};
field* fieldInitialize(const int size_x, const int size_y) //this function seems to work correctly, I've mostly added it as an indicator
{
field* terrain = malloc(sizeof(*terrain));
if (terrain == NULL)
printf("fail1");
terrain->fsize_x = size_x;
terrain->fsize_y = size_y;
f_part* ptrToFPart = NULL;
terrain->fbody = malloc(sizeof(ptrToFPart) * size_x); //this is where I allocate the space for an array of pointers
if (terrain->fbody == NULL)
printf("fail2");
int i,j;
for (i = 0 ; i < size_x ; i++)
{
terrain->fbody[i] = malloc(sizeof(f_part) * size_y);
for (j = 0 ; j < size_y ; j++)
{
terrain->fbody[i][j].caractere = 'a';
terrain->fbody[i][j].color = 0;
}
}
terrain->fsize_x = size_x;
terrain->fsize_y = size_y;
return terrain;
}
void fieldDestroy(field* terrain) //this is the function that is supposed to destroy the object and free the memory, and fails
{
int i;
for (i = 0 ; i < terrain->fsize_x ; i++)
{
free(terrain->fbody[i]); //this part always goes well
}
printf("flag 1\n");
free(terrain->fbody); //this is where the access violation happens, when it does
printf("flag 2\n");
free(terrain); //this part goes well too
printf("flag 3\n");
}
int main()
{
field* testField = fieldInitialize(5, 5);
fieldDestroy(testField); //This is the function that fails. Sometimes.
return 0;
}
Ошибка систематически возникает в той строке, которая занимает последнюю строку, когда я пытаюсь освободить пространство, выделенное для массива указателей.За исключением того, что это не всегда происходит!Иногда я могу освободить terrain-> fbody, и все идет хорошо, но иногда я не могу освободить пространство.Я получаю ошибку 0xC0000005, что, по-видимому, означает «нарушение доступа».То, что я понимаю, было бы обычным делом при динамическом распределении памяти, но почему я, кажется, получаю ошибку только половину времени?
Редактировать: Хорошо, поэтому я немного отредактировал код.Интересно, что хотя мой Windows 10 не работает между флагами 1 и 2, мой Windows 7 не работает между флагами 2 и 3 и тоже возвращает ошибку 0xC0000005.Но опять же, только изредка.