señal 11 SIGSEGV en malloc?

Por lo general me encantan las buenas preguntas y respuestas explicadas. Pero en este caso realmente no puedo dar más pistas.

La pregunta es: ¿por qué malloc () me está dando SIGSEGV? El programa de depuración de abajo muestra que el programa no tiene tiempo para probar el puntero devuelto a NULL y salir. El programa sale de DENTRO MALLOC!

Supongo que mi malloc en glibc está bien. Tengo un sistema debian / linux wheezy, actualizado, en un antiguo pentium (i386 / i486 arch).

Para poder rastrear, generé un volcado de núcleo. Vamos a seguirlo:

iguana$gdb xadreco core-20131207-150611.dump

Core was generated by `./xadreco'.
Program terminated with signal 11, Segmentation fault.
#0  0xb767fef5 in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) bt
#0  0xb767fef5 in ?? () from /lib/i386-linux-gnu/libc.so.6
#1  0xb76824bc in malloc () from /lib/i386-linux-gnu/libc.so.6
#2  0x080529c3 in enche_pmovi (cabeca=0xbfd40de0, pmovi=0x...) at xadreco.c:4519
#3  0x0804b93a in geramov (tabu=..., nmovi=0xbfd411f8) at xadreco.c:1473
#4  0x0804e7b7 in minimax (atual=..., deep=1, alfa=-105000, bet...) at xadreco.c:2778
#5  0x0804e9fa in minimax (atual=..., deep=0, alfa=-105000, bet...) at xadreco.c:2827
#6  0x0804de62 in compjoga (tabu=0xbfd41924) at xadreco.c:2508
#7  0x080490b5 in main (argc=1, argv=0xbfd41b24) at xadreco.c:604
(gdb) frame 2
#2  0x080529c3 in enche_pmovi (cabeca=0xbfd40de0, pmovi=0x ...) at xadreco.c:4519
4519        movimento *paux = (movimento *) malloc (sizeof (movimento));
(gdb) l
4516 
4517    void enche_pmovi (movimento **cabeca, movimento **pmovi, int c0, int c1, int c2, int c3, int p, int r, int e, int f, int *nmovi)
4518    {
4519        movimento *paux = (movimento *) malloc (sizeof (movimento));
4520        if (paux == NULL)
4521            exit(1);

Por supuesto, necesito mirar el fotograma 2, el último en la pila relacionado con mi código. ¡Pero la línea 4519 da SIGSEGV! No tiene tiempo para probar, en la línea 4520, si paux == NULL o no.

Aquí está "movimento" (abreviado):

typedef struct smovimento
{
    int lance[4];  //move in integer notation
    int roque; // etc. ...

    struct smovimento *prox;// pointer to next
} movimento;

Este programa puede cargar MUCHA memoria. Y sé que la memoria está en sus límites. Pero pensé que malloc se manejaría mejor cuando la memoria no estuviera disponible.

Haciendo un$free -h Durante la ejecución, puedo ver la memoria hasta 1 MB. Está bien. La vieja computadora solo tiene 96MB. Y 50MB es utilizado por el sistema operativo.

No sé dónde empezar a mirar. Tal vez comprobar la memoria disponible ANTES de una llamada malloc? Pero eso suena como una pérdida de poder de computadora, como malloc supuestamente haría eso.sizeof (movimento) es sobre48 bytes. Si hago pruebas antes, al menos tendré alguna confirmación del error.

Cualquier idea, por favor comparta. Gracias.

Respuestas a la pregunta(1)

Su respuesta a la pregunta