繁体   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