Signal 11 SIGSEGV in malloc?

Normalerweise liebe ich gut erklärte Fragen und Antworten. Aber in diesem Fall kann ich wirklich keine Hinweise mehr geben.

Die Frage ist: Warum gibt mir malloc () SIGSEGV? Das Debuggen zeigt an, dass das Programm keine Zeit hat, den zurückgegebenen Zeiger auf NULL zu testen und zu beenden. Das Programm wird beendet INSIDE MALLOC!

Ich gehe davon aus, dass mein Malloc in Glibc in Ordnung ist. Ich habe ein aktualisiertes Debian / Linux-Wheezy-System in einem alten Pentium (i386 / i486-Bogen).

Um verfolgen zu können, habe ich einen Core-Dump generiert. Folgen wir ihm:

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);

Natürlich muss ich mir Bild 2 ansehen, das letzte auf dem Stapel, das sich auf meinen Code bezieht. Aber die Linie 4519 gibt SIGSEGV! Es hat keine Zeit, in Zeile 4520 zu testen, ob paux == NULL ist oder nicht.

Hier ist es "movimento" (abgekürzt):

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

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

Dieses Programm kann eine Menge Speicher laden. Und ich weiß, dass die Erinnerung an ihre Grenzen stößt. Aber ich dachte, Malloc würde besser damit umgehen, wenn kein Speicher verfügbar ist.

A$free -h Während der Ausführung kann ich nur 1 MB Speicher sehen! Kein Problem. Der alte Computer hat nur 96MB. 50 MB werden vom Betriebssystem verwendet.

Ich weiß nicht, wo ich anfangen soll zu suchen. Vielleicht überprüfen Sie den verfügbaren Speicher vor einem Malloc-Aufruf? Aber das klingt nach einer Verschwendung von Computerleistung, wie malloc das angeblich tun würde.sizeof (movimento) handelt von48 bytes. Wenn ich vorher teste, habe ich zumindest eine Bestätigung des Fehlers.

Irgendwelche Ideen, bitte teilen. Vielen Dank.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage