2016-04-28 4 views
-1

Вызов этого значения работает для первых 2 вызовов, а затем вызывает ошибку сегментации.Связанный список функций функции приводит к ошибке сегментации

void insert_message(char *id, char *message) { 
    if (first_message == NULL) { 
     first_message = malloc(sizeof(struct server_message)); 
     strcpy(first_message->id, id); 
     strcpy(first_message->message, message); 
     first_message->next_msg = NULL; 
    } else { 
     struct server_message *curr_msg = first_message; 

     while (curr_msg != NULL) { 
      curr_msg = curr_msg->next_msg; 
     } 

     curr_msg->next_msg = malloc(sizeof(struct server_message)); 
     strcpy (curr_msg->next_msg->id, id); 
     strcpy (curr_msg->next_msg->message, message); 
     curr_msg->next_msg->next_msg = NULL; 
    } 
} 

Первая структура сообщений и Server Message:

// used to store messages. 
struct server_message { 
    char message[80]; 
    char id[80]; 
    struct server_message *next_msg; 
}; 

//head of the list 
static struct server_message *first_message = NULL; 
+2

в то время ----> в то время как (! Curr_msg-> next_msg = NULL) – sigmalha

+1

Вместо 'curr_msg = NULL' использовать' curr_msg-> next_msg! = NULL' – jboockmann

+0

Отладчик ....................... –

ответ

1

Ваш цикл заканчивается, когда curr_msg == NULL держит. Вызов curr_msg->next_msg = malloc(sizeof(struct server_message)); не удастся, так как вы не можете разыменовать NULL. Поэтому сделайте следующее: (! Curr_msg = NULL)!

while (curr_msg->next_msg != NULL) { 
    curr_msg = curr_msg->next_msg; 
} 
// curr_msg is now the last node in your list 
-1
As per your loop , after came out of loop , you have to allocate memory for curr_msg & you have to fill the necessary info in that curr_msg structure. Because in your curr_msg structure ,already you stored the link to next_msg 

so you have to modify your code like below 

while (curr_msg != NULL) 
{ 
      curr_msg = curr_msg->next_msg; 
} 

curr_msg = malloc(sizeof(struct server_message)); 
strcpy (curr_msg->id, id); 
strcpy (curr_msg->message, message); 
curr_msg->next_msg = NULL; 
+0

Выполнение этого НЕ добавит новый узел в список! – jboockmann

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