2010-05-14 1 views
6

Ho una struct gioco denominato con una serie di livelli, definito così:problema Segmentation fault (C)

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

Quando compilo il codice, se x è 1, 2 o 3, il programma viene eseguito normalmente. Se è un qualsiasi altro valore (4, ad esempio), ottengo un errore di segmentazione. Non sto accedendo all'array da nessuna parte. Principale è qualcosa di simile al momento (tutto tranne commentato l'inizializzazione):

int main (...) 
{ 
    Game g; 

    return 0; 
} 

Qualsiasi idea di cosa questo potrebbe essere?

Grazie in anticipo.

+3

Possiamo vedere quale livello è, o almeno la sua dimensione per quanto riguarda l'allocazione statica? Ho un'intuizione enorme. –

risposta

4

Quanto è grande un Level? È possibile che tu stia straripando il tuo stack? Dato che non c'è (a quanto pare) sempre e solo un gioco di oggetti in ogni caso, forse sarebbe meglio utilizzando la classe static stoccaggio, come in: static Game g;

Edit: Se si vuole forzare allocazione sul mucchio, mi piacerebbe consiglia di utilizzare std::vector<Level> levels; anziché utilizzare i puntatori direttamente. Oops: manca il tag C, non C++.

+2

Sono d'accordo che probabilmente sta traboccando lo stack, ma la domanda non è C++ :) –

+0

Oppure puoi semplicemente spostare la dichiarazione di g all'esterno della funzione main(). –

+0

Grazie per il suggerimento. Ho appena usato la statica poiché ho un solo oggetto e funziona in questo modo.Il programma non ha causato un errore di segmentazione sul mio computer, ma ha causato quello che stavo usando in quel momento (è molto vecchio quindi probabilmente era il problema). Il livello è una grande classe, ma ho pensato che non avrebbe comunque causato un errore di segmentazione. – user228938

5

Se il livello di classe/struct è davvero grande, si potrebbe provare a utilizzare questo:

typedef struct { 
    Level *levels; 
} Game; 

e ripartendo poi i livelli con malloc() o nuova. O se si ha realmente bisogno di una serie di livelli:

typedef struct { 
    Level* levels[NUM_LEVELS]; 
} Game; 

ripartendo poi livelli con qualcosa di simile:

// Allocate levels 
int i; 
for(i=0;i<NUM_LEVELS;i++) { 
    gameStruct.levels[i] = (Level*)malloc(sizeof(Level)); 
    initLevelNum(gameStruct.levels[i], i); 
} 
4

Sulla mia macchina, questo codice

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

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

int main (...) 
{ 
    Game g; 

    return 0; 
} 

si blocca, mentre doesn 't se cambio la dimensione della serie levels su 3.

Si dovrebbe ridurre la dimensione del tipo Level (mettendo dati sul mucchio invece della pila) o mettere i livelli nel mucchio (mantenendoli in un array di puntatori per allocato dinamicamente Level oggetti) .

+0

Si potrebbe anche rendere globale il livello. Probabilmente non è usato in modo tale che sarebbe un problema. – nategoose

0

Se si dispone effettivamente della dimensione dei dati e si insiste per far sì che lo stack sia assegnato, l'impostazione della dimensione dello stack sul linker potrebbe essere un'opzione. Se mi sbaglio per favore correggetemi come trovo questo argomento interessante

0

Di solito, in casi simili è necessario dichiarare la variabile statica:

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

    return 0; 
} 

Così la variabile sarà stata assegnata e inserita nella zona statica in compilato tempo.