[英]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.