2013-04-03 3 views
0
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; 
    } 

} 
+3

Не могли бы вы добавить текст к этому коду, описав проблему за довольно лаконичным названием? – cnicutar

+0

Вы не выделяете память для 'server_id' в' add_server'. Вы выделяете память в вызывающей функции или продолжаете обновлять один и тот же массив символов? Последнее будет означать, что все узлы указывают на один и тот же экземпляр 'server_id', поэтому все они будут обновлены. – simonc

ответ

1

Во-первых, 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); 
+0

Это список, связанный с циклом. Это означает, что последний узел показывает первый узел. Я избегаю использования null – user217895

+0

@ user217895 Да, я понял, я переписал свой ответ. – unwind

+0

Когда я меняю int add_server() на сервер add_server(). компилятор дает ошибку – user217895