2016-04-28 4 views
-2

Das Abrufen einer Nachricht aus einer verknüpften Liste und das Entfernen dieser Nachricht aus der Liste führt zu einem Segmentierungsfehler.Abrufen und Entfernen von verknüpften Listenergebnissen Segmentierungsfehler

erste Nachricht und Server Message-Struktur:

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

Get Nachrichtenfunktion

char *get_message(char *id) { 
    char *message; 
    char *not_found =(char *) malloc(sizeof(char) * 20); 
    not_found = "No messages available"; 
    struct server_message *curr_msg = first_message; 
    struct server_message *prev_msg = first_message; 

    if (curr_msg != NULL && (strcmp(curr_msg->id, id) != 0)) { 
     strcpy (message, curr_msg->message); 
     //Remove message 
     first_message = NULL; 
     return message; 
    } 


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

     if (strcmp(curr_msg->id, id) != 0) { 
      strcpy (message, curr_msg->message); 
      //Remove message 
      prev_msg->next_msg = curr_msg->next_msg; 
      return message; 
     } else { 
      prev_msg = curr_msg; 
     } 
    } 
    return not_found; 
} 

Aktualisiert-Code Noch seg Verwerfungen

char *get_message(char *id) { 
    char *message = (char *) malloc(sizeof(char) * 80); 
    char *not_found=(char *) malloc(sizeof(char) * 20); 
    strcpy(not_found, "No messages available"); 
    struct server_message *curr_msg = first_message; 
    struct server_message *prev_msg = NULL; 

    while (curr_msg->next_msg != NULL) { 

     if (strcmp(curr_msg->id, id) != 0) { 
      strcpy (message, curr_msg->message); 
      //Remove message 
      if (prev_msg == NULL) { 
       first_message = curr_msg->next_msg; 
      } else { 
       prev_msg->next_msg = curr_msg->next_msg; 
      } 
      return message; 
     } else { 
      prev_msg = curr_msg; 
      curr_msg = curr_msg->next_msg; 
     } 
    } 
    return not_found; 
} 
+0

Debugger ....................... –

+1

Dieser Code ist ernsthaft beschädigt. Speicherlecks, Dereferenzierungen von nicht initialisierten Zeigern usw. Nur ein paar: (1) "Nachricht" wird nie initialisiert, aber Sie versuchen, es zu speichern. Segmentierungsfehler (2) 'not_found' wird auf Speicher von' malloc' gesetzt. Aber bevor dieser Speicher jemals benutzt wird, wird 'not_found' sofort auf eine konstante Zeichenkette gesetzt. Speicherleck. Ich bin sicher, da ist mehr. Dies scheint eher ein Problem zu sein, wenn man C nicht kennt, als einen Fehler zu finden. –

+0

@TomKarzes Für die Nachricht kann ich 'char message [80]' verwenden? –

Antwort

0

Überarbeitete komplettes Beispiel:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

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

char *get_message(char *id) { 
    struct server_message *curr_msg = first_message; 
    struct server_message *prev_msg = NULL; 

    while (curr_msg != NULL) {    /* FIX1: iterate until we do not have an item */ 
     if (strcmp(curr_msg->id, id) == 0) { /* FIX2: 0 is equal */ 
      //Remove message 
      if (prev_msg == NULL) { 
       first_message = curr_msg->next_msg; 
      } else { 
       prev_msg->next_msg = curr_msg->next_msg; 
      } 
      return strdup(curr_msg->message); 
     } else { 
      prev_msg = curr_msg; 
      curr_msg = curr_msg->next_msg; 
     } 
    } 
    return strdup ("No messages available"); 
} 

struct server_message d = {"foo-4", "4", 0}; 
struct server_message c = {"foo-3", "3", &d}; 
struct server_message b = {"foo-2", "2", &c}; 
struct server_message a = {"foo-1", "1", &b}; 

int main(int argc, char *argv[]) 
{ 
     char *t; 

     first_message = &a; 

     t = get_message("1"); 
     printf ("1: %s\n", t); 
     free (t); 

     t = get_message("3"); 
     printf ("3: %s\n", t); 
     free (t); 

     t = get_message("10"); 
     printf ("10: %s\n", t); 
     free (t); 

     return 0; 
} 
+0

Ich habe versucht, den Code zu aktualisieren, wie Sie erwähnt, aber es immer noch scheitern. Würde es dir etwas ausmachen, einen Blick auf die Updates zu werfen, die ich gepostet habe? –

+0

Sie haben 20 Bytes in 'not_found' zugewiesen, während' "Keine Nachrichten verfügbar" 'mehr als 20 Bytes sind. Fügen Sie außerdem eine Nullprüfung für den Zeiger "first_message" hinzu. – kuro

+0

Ich sah auch nicht, dass 20 Bytes nicht genug ist .. Am einfachsten in Bezug auf die nicht gefundene Rückkehr, wäre 'zurück strdup (" Keine Nachrichten verfügbar ");' Aber der Code hat Speicher-Lecks aswell .. –