【问题标题】:All node's id are same with the last added node's id所有节点的 id 与最后添加的节点的 id 相同
【发布时间】:2013-04-03 09:27:35
【问题描述】:
int add_server(Server *list, char *server_id, char *capacity)
{
    Server *new_node=(Server *)malloc(sizeof(Server));

    new_node->id=server_id;
    new_node->capacity=atoi(capacity);

    if(list==NULL)
    {
        list=new_node;
        list->next=list;
        return list;
    }
    else
    {

        Server *temp=list;

        while(temp->next!=list)
        {
            temp=temp->next;
        }

        temp->next=new_node;
        new_node->next=list;
    }

}

【问题讨论】:

  • 您能否在该代码中添加一些文本,在相当简洁的标题之外描述问题?
  • 您没有在add_server 中为server_id 分配内存。您是在调用函数中分配内存还是不断更新同一个 char 数组?后者意味着所有节点都指向同一个 server_id 实例,因此它们的 id 都会更新。

标签: c pointers struct singly-linked-list


【解决方案1】:

首先,please don't cast malloc()'s return value in C

其次,return list; 在返回int 的函数中很奇怪,这可能会导致问题。显然,该函数必须返回 Server *list 的类型)才能有意义。或者它可以使list 参数具有Server ** 类型并重写调用者的指针,但这通常不太方便使用。

第三,你只复制id的指针,所以如果用例如调用它一个本地的char 缓冲区持有不同的名称,你会得到你描述的效果。您需要在 Server 中将 id 设为实际数组,或者在存储之前在参数上调用 strdup()

所以,要么:

typedef struct {
    /* ... */
    char server_id[32];
    /* ... rest of fields ... */
} Server;

strlcpy(new_node->server_id, server_id, sizeof new_node->server_id);

或:

new_node->id = strdup(server_id);

【讨论】:

  • 循环链表。这意味着最后一个节点显示第一个节点。我避免使用 null
  • @user217895 是的,我意识到,我已经重写了我的答案。
  • 当我将 int add_server() 更改为 Server add_server() 时。编译器报错
  • 谢谢大家,new_node->id=strdup(server_id) 有效。这个问题对我来说非常重要。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
相关资源
最近更新 更多