Есть ли ограничение на размер массива структур в c - PullRequest
0 голосов
/ 19 июня 2020

Итак, я делаю текстовую игру и столкнулся с проблемой. Я сделал карту 101 на 101 следующих struct элементов для каждой плитки:

struct tile
{
    char name[21];
    short id;
    char description[100];
}; //End tile struct

Это занимает чуть более 1 МБ памяти. Если я изменю размер карты на 103 на 103, то все будет нормально; но, если я изменю его на 151 на 151, программа выйдет из строя, когда я попытаюсь войти в свою функцию сохранения.

Есть ли для этого причина и, если да, могу ли я это исправить?

Я использую 64-битную систему, поэтому, насколько мне известно, указатели должны иметь возможность адресовать все правильно, но, возможно, я ошибаюсь.

EDIT : функция для воспроизвести это будет:

int main()
{
    struct tile map[151][151];

    mapGen(map);

} //End main

Что делает функция mapGen, на самом деле не имеет значения, поскольку это не проблема. Мне сказали, что стек может содержать только 1 МБ памяти и, как только он пытается загрузить main (или save(), в моем случае), он приводит к сбою программы.

1 Ответ

0 голосов
/ 20 июня 2020

Поскольку массив определен в области видимости блока, он находится в стеке. Учитывая размер вашего массива, он займет около 2,8 МБ места, что больше, чем позволяет большинство реализаций стека. Это приводит к переполнению стека, которое вызывает неопределенное поведение .

Если вы переместите массив за пределы любой функции, чтобы он имел область действия файла, он вместо этого будет находиться в разделе данных, который может обрабатывать переменная такого размера. Вы также можете оставить его в области видимости блока и использовать модификатор static, который также помещает переменную в раздел данных и дает ей полное время жизни программы.

Вы также можете динамически выделять для нее место в куче:

struct tile (*map)[151] = malloc(sizeof(*map) * 151);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...