2D массив в структуре - это возможно? - PullRequest
0 голосов
/ 12 марта 2011

Я пытаюсь создать структуру с двумерным массивом для хранения строк.Но я продолжаю получать ошибку двойного освобождения при выполнении программы

struct:

    struct room{
        int x;
        int y;
        char ** floor;
};

Вот мой malloc:

struct room * newRoom = malloc(sizeof(struct room));
newRoom->floor = malloc(sizeof(char *) * height);
if(newRoom->floor == NULL || newRoom == NULL)
{
    printf("Room allocation failed \n");
}
for(i=0; i<width ;i++)
{
    newRoom->floor[i] = malloc(sizeof(char) * (width + 1));
    if(newRoom->floor[i] == NULL)
    {
        printf("Room string allocation failed \n");
    }
}

и мой free, которыйчто, по-видимому, вызывает ошибку:

for(i=0; i<size ;i++)
{
    free(toBeFreed->floor[i]);
}
free(toBeFreed->floor);
free(toBeFreed);

Я не особо много делаю с массивом, кроме как заполняю его символами (используя для циклов) и вызываю mvprintw (), поэтому я не думаю проблема между ними.Что я делаю неправильно?

Редактировать: поэтому я должен был уточнить, но ширина == высота == размер, переменные находятся в разных файлах, поэтому они немного отличаются

РЕДАКТИРОВАТЬ2:очевидно, высота! = ширина, и я даже не могу держать имя своей переменной прямо!

Ответы [ 2 ]

3 голосов
/ 12 марта 2011

При выделении вы используете:

for(i=0; i<width ; i++)

При освобождении вы используете:

for(i=0; i<size ;i++)

Если ширина! = Размер, у вас будут проблемы.

1 голос
/ 12 марта 2011
for(i=0; i<width ;i++)

должно быть

for(i=0; i<height;i++)

верно?

и

for(i=0; i<size ;i++)
{
    free(toBeFreed->floor[i]);
}

должно быть

for(i=0; i<height;i++)
{
    free(toBeFreed->floor[i]);
}

Также

malloc(sizeof(char) * (width + 2));

Откуда взялся +2?

Кроме того, что это выглядит довольно хорошо, можете ли вы предоставить код, как вы хотите его использовать?

...