所以我对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,而我找不到如何执行此操作的方法。欢迎任何帮助。
答案 0 :(得分:0)
在功能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
。