所有节点的id与最后添加的节点的id相同

时间:2013-04-03 09:27:35

标签: c pointers struct singly-linked-list

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

}

1 个答案:

答案 0 :(得分: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);