リンクリストからメッセージを取得し、そのメッセージをリストから削除すると、セグメンテーションフォールトが発生します。セグメンテーションフォルトのリンクリスト結果を取得および削除する
最初のメッセージとサーバーメッセージ構造体:
// 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メッセージ機能
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;
}
それでもフォルトSEGコードを更新しました
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;
}
デバッガ....................... –
このコードは大きく壊れています。メモリリーク、初期化されていないポインタの逆参照など。ちょうどカップル:(1) 'message'は決して初期化されませんが、あなたはそれを格納しようとします。セグメンテーションフォルト。 (2) 'not_found'は' malloc'からの格納に設定されます。しかし、その記憶領域が使用される前に、 'not_found'はすぐに定数文字列に設定されます。メモリーリーク。それ以上のものがあると確信しています。これはバグを見つけるよりもCを知らないという問題のほうが多いようです。 –
@TomKarzesメッセージの場合、 'char message [80]'を使用できますか? –