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