2010-05-14 14 views
6

Tengo un struct llamado juego con una variedad de niveles, que se define así:problema de fallo de segmentación (C)

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

Cuando compilar el código, si x es 1, 2 o 3, el programa se ejecuta normalmente. Si es cualquier otro valor (4, por ejemplo), aparece un error de segmentación. No estoy accediendo a la matriz en ninguna parte. Principal es algo como esto en este momento (comentó todo menos la inicialización):

int main (...) 
{ 
    Game g; 

    return 0; 
} 

¿Alguna pista de lo que podría ser esto?

Gracias de antemano.

+3

¿Podemos ver qué es 'level ', o al menos su tamaño en lo que respecta a la asignación estática? Tengo una corazonada es enorme. –

Respuesta

4

¿Qué tan grande es Level? ¿Es posible que desbordes tu pila? Dado que no hay (aparentemente) sólo alguna vez un juego de objetos de todos modos, tal vez sería mejor utilizar la clase static de almacenamiento, como en: static Game g;

Editar: Si desea forzar la asignación en el montón, me aconseje usar std::vector<Level> levels; en lugar de usar punteros directamente. ¡Uy! Se ha olvidado de haber sido etiquetado C, no C++.

+2

Estoy de acuerdo con que probablemente esté desbordando la pila, pero la pregunta no es C++ :) –

+0

O puede simplemente mover la declaración de g fuera de la función main(). –

+0

Gracias por la sugerencia. Acabo de usar estática ya que solo tengo un objeto y funciona de esa manera.El programa no causó una falla de segmentación en mi computadora, pero causó en la que yo estaba usando en ese momento (es realmente viejo, así que probablemente ese fue el problema). El nivel es una gran clase, pero supuse que no causaría una falla de segmentación de todos modos. – user228938

5

Si el nivel de clase/estructura es muy grande, se podría tratar de usar esto:

typedef struct { 
    Level *levels; 
} Game; 

y luego la asignación de sus niveles con malloc() o una nueva. O si realmente se necesita una serie de niveles:

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

continuación, los niveles de asignación con algo como esto:

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

En mi máquina, el código

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

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

int main (...) 
{ 
    Game g; 

    return 0; 
} 

accidentes, mientras que doesn 'Si cambio el tamaño de la matriz levels a 3.

Se debería reducir el tamaño de su tipo Level (poniendo los datos en el montón en lugar de la pila) o poner sus niveles en el montón (manteniéndolos en una variedad de punteros a asignado dinámicamente Level objetos) .

+0

También podría hacer que el nivel sea global. Probablemente no se usa de tal manera que eso sería un problema. – nategoose

0

Si realmente tiene el tamaño de sus datos e insiste en tenerlo asignado, tal vez sea una opción establecer el tamaño de la pila en el enlazador. Si estoy equivocado por favor, corríjanme como encuentro este interesante tema

0

Por lo general, en casos similares se debe declarar la variable estática:

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

    return 0; 
} 

lo tanto la variable habrá sido asignado y se inserta en el área estática en compilada hora.

Cuestiones relacionadas