2013-04-03 83 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

您不會爲'add_server'中的'server_id'分配內存。你在調用函數中分配內存還是繼續更新相同的char數組?後者意味着所有節點都指向相同的'server_id'實例,因此所有節點都將更新它們的ID。 – simonc

回答

1

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

其次,return list;在返回int的函數中很奇怪,這可能會導致問題。很明顯,該功能必須返回Server *list的類型)以便合理。或者它可以使list參數的類型爲Server **並重新編寫調用者的指針,但這通常不便於使用。

第三,你只複製id的指針,所以如果用例如一個當地的緩衝區擁有不同的名字,你會得到你描述的效果。您需要在存儲前將參數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()更改爲Server add_server()時。編譯器給出錯誤 – user217895

相關問題