簡體   English   中英

C鏈表-指針值更改

[英]C Linked list - value of pointer changing

因此,我對C和指針還不陌生,我有一個項目供學校完成添加到鏈表中的功能

它是這樣的:

TEMPLOYEE * newEmployee(const char * name, TEMPLOYEE * next)
{
    TEMPLOYEE* head = NULL;
    head = malloc(sizeof(TEMPLOYEE));
    if(head==NULL)
    {
        return 1;
    }

    head -> m_Name = name;
    head -> m_Next = next;
    head -> m_Bak = NULL;
}

這在以字符串形式輸入名稱時有效,例如a = newEmployee ( "Peter", a ); 但是當我嘗試使用一個臨時值添加m_Name像這樣

strncpy ( tmp, "Victoria", sizeof ( tmp ) );
a = newEmployee ( tmp, a );
strncpy ( tmp, "Peter", sizeof ( tmp ) );
a = newEmployee ( tmp, a );

列表將隨着值的變化而變化,因此它將有兩名雇員,名為Peter,而不是Peter和Victoria,我找不到如何做的方法。 歡迎任何幫助。

在函數newEmployee() ,您正在執行以下操作:

head -> m_Name = name;

在兩個newEmployee()調用中,您都傳遞了tmp

a = newEmployee ( tmp, a );
a = newEmployee ( tmp, a );

因此,兩個節點的name指針都指向包含名稱的相同位置tmp 如果您對tmp的值進行了任何更改,它將同時反映在兩者中。

內存視圖如下所示:

---------------------
|m_Name|m_Next|m_Bak|
---------------------
    | 
    \/    tmp
   -----------
   | Peter   |
   -----------
    /\
    |
---------------------
|m_Name|m_Next|m_Bak|
---------------------

// Both the node m_Name is pointing to same location.
// Make any change in tmp and the changes will reflect in both the pointers
// as they are pointing to same location.

要解決此問題,您應該將內存分配給m_Name並將tmp復制到其中。 您可以使用strdup()解決此問題。 newEmployee() ,替換為:

head -> m_Name = name;

有了這個:

head -> m_Name = strdup(name);

strdup()函數返回一個指向新字符串的指針,該指針與傳遞給它的字符串的副本相同。 strdup()為新字符串分配一個內存,並返回其指針。 完成后,請確保使用free()它。 請注意, strdup()不屬於C標准。

newEmployee()函數的返回類型為TEMPLOYEE *但如果malloc成功,則不會從此函數返回任何內容。 另外,如果malloc由於某種原因而失敗,那么您將從中返回不正確的整數常量1 相反,如果失敗,您應該返回NULL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM