2016-04-28 60 views
-2

从链接列表中检索消息,然后从列表中删除该消息会导致分段错误。从链接列表中获取并从链接列表中删除结果出现分段错误

第一条消息和服务器消息的结构:

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

更新代码仍然赛格断层

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

调试器....................... –

+1

此代码严重损坏。内存泄漏,未初始化指针的解引用等等。只是一对夫妇:(1)'message'永远不会被初始化,然而你试图存储它。分段故障。 (2)''not_found'被设置为从'malloc'存储。但是在这个存储被使用之前,'not_found'立即被设置为一个常量字符串。内存泄漏。我相信还有更多。这看起来更像是一个不知道C的问题,而不是寻找错误。 –

+0

@TomKarzes对于消息我可以使用'char消息[80]'? –

回答

0

修订完整的例子:

#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

我尝试更新代码,因为你提到,但它仍然失败。你介意看看我发布的更新吗? –

+0

您在'not_found'中分配了20个字节,而“无可用消息”的分配大于20个字节。另外,为指针first_message添加一个空检查。 – kuro

+0

我也看到不是20个字节是不够的..最简单的关于not_found返回,将'返回strdup(“没有消息可用”);' 但是,代码有内存泄漏以及.. –