сигнал 11 SIGSEGV в malloc?

Я обычно люблю хорошо объясненные вопросы и ответы. Но в этом случае я действительно не могу дать больше подсказок.

Вопрос в том, почему malloc () дает мне SIGSEGV? Отладка ниже показывает, что программа не успевает проверить возвращенный указатель на NULL и выйти. Программа выходит изнутри MALLOC!

Я предполагаю, что мой malloc в glibc просто в порядке. У меня система debian / linux wheezy, обновленная, в старом Pentium (арка i386 / i486).

Чтобы иметь возможность отслеживать, я создал дамп ядра. Позвольте этому следовать:

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

Конечно, мне нужно взглянуть на кадр 2, последний в стеке, связанный с моим кодом. Но линия 4519 дает SIGSEGV! У него нет времени, чтобы проверить в строке 4520, paux == NULL или нет.

Вот это "movimento" (сокращенно):

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

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

Эта программа может загрузить много памяти. И я знаю, что память в ее пределах. Но я думал, что malloc справится лучше, когда память не доступна.

Делать$free -h во время выполнения я вижу память до 1 МБ! Это нормально. Старый компьютер имеет только 96 МБ. И 50 МБ используется ОС.

Я не знаю, где начать искать. Может быть, проверить доступную память ДО вызова malloc? Но это звучит впустую из-за вычислительной мощности компьютера, как предположительно сделал бы это Маллок.sizeof (movimento) около48 bytes, Если я проверю раньше, по крайней мере, у меня будет какое-то подтверждение ошибки.

Любые идеи, пожалуйста, поделитесь. Благодарю.

Ответы на вопрос(1)

Ваш ответ на вопрос