Пустой указатель условного поднятия сегфо - PullRequest
1 голос
/ 31 мая 2011

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

Program received signal SIGSEGV, Segmentation fault.
0x0804a9c1 in DLinkDelete (delete=0xd8c9d33c) at test.c:213
213             if (prevdl && prevdl->next) 
(gdb) p prevdl
$39 = (DoubleLink *) 0xdadadada
(gdb) p prevdl->next
$40 = (void *) 0x0

DoubleLink - это структура со следующим форматом:

typedef struct
{
    void *next;
    void *prev;
} DoubleLink;

Почему здесь возникает ошибка сегментации?

Ответы [ 6 ]

5 голосов
/ 31 мая 2011

Предположительно prevdl указывает на недействительную память? Да ладно, 0xdadadada действительно выглядит для вас как действительный адрес? " Это слишком идиотизм, чтобы быть шизофреником ".

0 голосов
/ 31 мая 2011

В частности, это означает, что вы обращаетесь к данным, которые вообще не были инициализированы .Вопрос - это первая попытка использовать эту структуру?

В любом случае, проверьте свой код инициализации;когда вы создаете узел, я ставлю на самый первый узел, который не имеет предыдущего, вы не устанавливаете его значение, но в приведенном выше коде вы пытаетесь получить к нему доступ.

0 голосов
/ 31 мая 2011

0xdadadada не похоже на очень вероятное значение для правильного указателя ... скорее всего отладочный инициализатор.

0 голосов
/ 31 мая 2011

0xdadadada выглядит немного подозрительно, возможно prevdl не было правильно инициализировано? Или, может быть, на него напал какой-то другой код.

Может быть, вам стоит попробовать запустить тест под valgrind и посмотреть, сообщает ли он что-нибудь?

0 голосов
/ 31 мая 2011

Значение:

0xdadadada

выглядит подозрительно в отличие от реального значения указателя. Тот факт, что указатель не равен NULL, не означает, что он действителен. И если вы используете неверный указатель, вы получите ошибку aseg или что-то еще.

0 голосов
/ 31 мая 2011

адрес 0xdadadada кажется очень странным, хотя он не равен NULL.Может быть, вы пытаетесь прочитать память, которая вам не разрешена.

...