У меня есть структура под названием Игра с массивом уровней, определенных как это:
typedef struct
{
Level levels[x];
} Game;
Когда я компилирую код, если x равняется 1, 2 или 3, прогоны программы обычно. Если это - какое-либо другое значение (4, например), я получаю отказ сегментации. Я не получаю доступ к массиву нигде. Основной что-то вроде этого в данный момент (прокомментировало все кроме инициализации):
int main (...)
{
Game g;
return 0;
}
Какая-либо подсказка того, каково это могло бы быть?
Заранее спасибо.
Насколько велик уровень
? Возможно ли, что вы переполняете свой стек? Учитывая, что в любом случае существует (по-видимому) только один объект Game, возможно, вам лучше использовать класс хранения static
, например: static Game g;
Изменить: Если вы хотите принудительно выделить память в куче, я бы посоветовал использовать Упс - пропустил, что он помечен как C, а не C ++. std :: vector
вместо использования указателей напрямую.
На моем компьютере происходит сбой этого кода
typedef struct {
char data[65536*4];
} Level;
typedef struct
{
Level levels[4];
} Game;
int main (...)
{
Game g;
return 0;
}
, но не происходит, если я изменяю размер массива уровней
на 3
.
Вам следует либо уменьшить размер вашего типа Level
(поместив данные в кучу вместо стека), либо поместить ваши уровни в кучу (сохраняя их в массиве указателей для динамически выделяемых объектов уровня
).
Обычно в подобных случаях необходимо объявить переменную статической:
int main(void) {
static struct foo bar[SIZE];
return 0;
}
Таким образом, переменная будет выделена и помещена в статическую область во время компиляции.
Если класс/структура Level очень большой, вы можете попробовать использовать это:
typedef struct {
Level *levels;
} Game;
и затем выделить ваши уровни с помощью malloc() или new. Или, если вам действительно нужен массив уровней:
typedef struct {
Level* levels[NUM_LEVELS];
} Game;
тогда выделение уровней с помощью чего-то вроде этого:
// Allocate levels
int i;
for(i=0;i<NUM_LEVELS;i++) {
gameStruct.levels[i] = (Level*)malloc(sizeof(Level));
initLevelNum(gameStruct.levels[i], i);
}
Если у вас действительно есть размер данных и вы настаиваете на том, чтобы они выделялись стеком, возможно, установка размера стека в компоновщике была бы вариантом. Если я ошибаюсь, пожалуйста, поправьте меня, поскольку я нахожу эту тему интересной
.