2013-05-11 5 views
0

Я пишу функцию, которая берет начальный указатель связанного списка и добавляет новый узел с предоставленным значением. Список, который я передаю, также может быть пустым. Но когда я пытаюсь запустить программу, я получаю ошибку сегментации 11. Может ли кто-нибудь помочь мне узнать, в чем я ошибаюсь?Ошибка сегментации с использованием gcc on iMac

void appendList(struct list* list, int value) { 
struct list* ptr = list; 
struct list* temp = (struct list*)malloc(sizeof(struct list)); 
temp->val = value; 
temp->next=NULL; 
if (ptr==NULL) { 
    ptr = temp; 
    return; 
} 
while ((ptr->next)!=NULL) { 
    ptr = ptr->next; 
} 
ptr->next = temp; 
} 

Вызов как:

int main() 
{ 
struct list* result; 
result = (struct list*)malloc(sizeof(struct list)); 
appendList(result,4); 
appendList(result,2); 
appendList(result,5); 

return 0; 
} 
+2

Если аргумент 'list' равен' NULL', функция не меняет его. Заставьте его возвращать указатель, 'struct list * appendList (...'. –

+0

Можете ли вы показать код, который используете для вызова функции и отслеживания вашего первого узла? – Bill

+0

Да Билл отлично понимает. Спасибо за помощь. – zarrion

ответ

2

Для первой итерации, при вызове функции, ваша функция не обрабатывает список пуст, так как вы вручную создали result узел в main. В результате, его указатель next не нужен и, по-видимому, не NULL (так как вы никогда не назначали его NULL в main), и именно поэтому вы можете терпеть крах.

Так, чтобы исправить эту аварию, используйте следующий main -

int main() 
{ 
struct list* result; 
result = (struct list*)malloc(sizeof(struct list)); 
result->next=NULL; 
result->val = 0; 

appendList(result,4); 
appendList(result,2); 
appendList(result,5); 

return 0; 
} 

Вы можете рассмотреть Daniel Fischer «s комментария и возвращает указатель, который будет другим способом устранить эту проблему.

+1

Содержимое «памяти malloc» является неопределенным, поэтому указатель 'next' может на законных основаниях быть нулевым указателем. (Я понимаю, что вы имеете в виду, но «никогда» не является сильным, «не нужно и, по-видимому, нет», может быть альтернативой.) –

+0

согласен и отредактировал ответ ... спасибо. – Bill

Смежные вопросы