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;
}
Debugger ....................... –
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. –
@TomKarzes Für die Nachricht kann ich 'char message [80]' verwenden? –