C链表-指针值更改

时间:2018-12-30 02:24:09

标签: c pointers linked-list char

所以我对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,而我找不到如何执行此操作的方法。欢迎任何帮助。

1 个答案:

答案 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