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;
}
}
ответ
Во-первых, please don't cast malloc()
's return value in C.
Во-вторых, return list;
является странным в функции, возвращающей int
, что может вызвать проблемы. Очевидно, что функция должна возвращать Server *
(тип list
), чтобы иметь смысл. Или это может привести к тому, что аргумент list
имеет тип Server **
и перезаписать указатель вызывающего абонента, но это часто менее удобно использовать.
В-третьих, вы копируете только указатель для идентификатора, поэтому, если вы вызываете это с помощью, например, локальный буфер char
, содержащий разные имена, вы получите эффект, который вы описываете. Вам нужно сделать id фактическим массивом в Server
или вызвать 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
@ user217895 Да, я понял, я переписал свой ответ. – unwind
Когда я меняю int add_server() на сервер add_server(). компилятор дает ошибку – user217895
Не могли бы вы добавить текст к этому коду, описав проблему за довольно лаконичным названием? – cnicutar
Вы не выделяете память для 'server_id' в' add_server'. Вы выделяете память в вызывающей функции или продолжаете обновлять один и тот же массив символов? Последнее будет означать, что все узлы указывают на один и тот же экземпляр 'server_id', поэтому все они будут обновлены. – simonc