【问题标题】:C Linked list - value of pointer changingC链表-指针的值改变
【发布时间】:2018-12-30 02:24:08
【问题描述】:

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

【问题讨论】:

  • 您在创建列表节点时使用相同的指针 (tmp),因此它们都指向相同的位置。你用“Peter”覆盖“Victoria”,所以两个节点都指向“Peter”
  • 您需要像为列表一样为每个名称分配单独的空间。
  • 另外,你的第一个例程不见了return head

标签: c pointers linked-list char


【解决方案1】:

在函数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 以防失败。

【讨论】:

  • 非常感谢,正是我需要的
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
相关资源
最近更新 更多