Ошибка нарушения доступа при попытке освободить массив - PullRequest
0 голосов
/ 13 апреля 2019

В настоящее время я работаю над структурами для личного проекта.Я пытаюсь использовать динамически распределяемые двумерные массивы, а затем освобождаю пространство, которое они занимают.Произошла ошибка при попытке освободить выделенное пространство.

Мне удалось сузить источник проблемы до функции, которую я настроил для разрушения своих структур, но не смог точно определитьпричина ошибки внутри.Еще более важным является тот факт, что ошибка, нарушение прав доступа, срабатывает только в половине случаев.Я включил функции ниже, с несколькими комментариями.Извините, если я включил здесь слишком много кода, но я искренне растерялся в словах и чувствую, что способ инициализации структур может повлиять на то, правильно ли я их уничтожаю.

#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.Но опять же, только изредка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...