Проблема отказа сегментации (C)

У меня есть структура под названием Игра с массивом уровней, определенных как это:

typedef struct 
{
     Level levels[x];
} Game;

Когда я компилирую код, если x равняется 1, 2 или 3, прогоны программы обычно. Если это - какое-либо другое значение (4, например), я получаю отказ сегментации. Я не получаю доступ к массиву нигде. Основной что-то вроде этого в данный момент (прокомментировало все кроме инициализации):

int main (...)
{
     Game g;

     return 0;
}

Какая-либо подсказка того, каково это могло бы быть?

Заранее спасибо.

6
задан Taylor Leese 14 May 2010 в 16:22
поделиться

5 ответов

Насколько велик уровень ? Возможно ли, что вы переполняете свой стек? Учитывая, что в любом случае существует (по-видимому) только один объект Game, возможно, вам лучше использовать класс хранения static , например: static Game g;

Изменить: Если вы хотите принудительно выделить память в куче, я бы посоветовал использовать std :: vector levels; вместо использования указателей напрямую. Упс - пропустил, что он помечен как C, а не C ++.

4
ответ дан 8 December 2019 в 18:33
поделиться

На моем компьютере происходит сбой этого кода

typedef struct {
    char data[65536*4];
} Level;

typedef struct 
{
     Level levels[4];
} Game;

int main (...)
{
     Game g;

     return 0;
}

, но не происходит, если я изменяю размер массива уровней на 3 .

Вам следует либо уменьшить размер вашего типа Level (поместив данные в кучу вместо стека), либо поместить ваши уровни в кучу (сохраняя их в массиве указателей для динамически выделяемых объектов уровня ).

4
ответ дан 8 December 2019 в 18:33
поделиться

Обычно в подобных случаях необходимо объявить переменную статической:

int main(void) {
    static struct foo bar[SIZE];

    return 0;
}

Таким образом, переменная будет выделена и помещена в статическую область во время компиляции.

0
ответ дан 8 December 2019 в 18:33
поделиться

Если класс/структура 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);
}
5
ответ дан 8 December 2019 в 18:33
поделиться

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

.
0
ответ дан 8 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: