Проблема ошибки сегментации (C) - PullRequest
6 голосов
/ 14 мая 2010

У меня есть структура с именем Game с массивом уровней, определенным так:

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

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

int main (...)
{
     Game g;

     return 0;
}

Есть хоть какие-то подсказки, что это может быть?

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

Ответы [ 5 ]

5 голосов
/ 14 мая 2010

Если класс / структура Уровня действительно большие, вы можете попробовать использовать это:

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);
}
4 голосов
/ 14 мая 2010

На моей машине этот код

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

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

int main (...)
{
     Game g;

     return 0;
}

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

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

4 голосов
/ 14 мая 2010

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

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

0 голосов
/ 15 мая 2010

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

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

    return 0;
}

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

0 голосов
/ 14 мая 2010

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

...