【问题标题】:Why are all my nodes pointing to the same character array?为什么我的所有节点都指向同一个字符数组?
【发布时间】:2017-04-11 23:58:13
【问题描述】:

想知道我能否就这个单链表问题获得帮助。

所以我有一个简单的结构,带有一个 next 指针和一个 char 指针来形成每个节点。

struct node{
          char * nodeName;
          node * next;
           }

在我的主函数中,我创建了一个名为 name 的动态分配的字符数组,它将被发送到一个函数,该函数在每次调用它时都会创建一个新节点,每次都应该由用户输入一个新名称并且应该分配给创建的每个新节点,但由于某些原因,所有节点都采用输入的最终名称。

我的猜测是所有节点都指向同一个 char 数组,但我不知道如何解决这个问题。这是我的代码。

int main()
{

      char * name = new char[MAX_SIZE]; // dynamic array declaration;
      for(int i = 0; i < 3; ++i) // do it x number of times.
      {
           cout << "Enter Node Name" << endl;
           cin.get(name, MAX_SIZE, '\n');
           cin.ignore(200, '\n');
           addNode(name);
      }

 return 0
}


void addNode(name[])
{
if(!head){ // creates a first node,
         head = new node;
         head->next = NULL;
         head->nodeName = "default node";
}
    node * current = head;
    node * newNode = new node;
    newNode->name = name;//assign user inputed name.
    newNode->next = NULL // set next pointer to null
    while(current->next)
     current = current->next; // traverse to the last node;
     current->next = newNode; // connect the new node at the end.

}

代码确实创建了列表,但所有节点的名称都相同,即用户输入的最后一个字符数组。 有什么建议吗?

【问题讨论】:

  • 你需要在addNode中复制name。最简单的是将 nodeName 设为 std::string
  • 或者,将char * name = new char[MAX_SIZE] 移入您的循环。不过老实说,使用std::string 确实是正确的方法。

标签: c++ arrays list pointers


【解决方案1】:

您的所有节点都指向同一个字符数组,因为您只分配了一个字符数组。那么他们还能指出什么?

由于对addNode 的每次调用都会传递相同的指针,因此当您执行此操作时:

newNode->name = name;//assign user inputed name.

您将每个节点的name 成员设置为相同的值。那不是你想做的。

您想要做什么取决于您没有向我们展示的代码。可能您想在addNode 中分配一些内存,将提供的名称复制到其中,并将newNode-&gt;name 设置为该指针。完成后,您必须修改代码以释放节点以释放该内存。

或者,您可以在addNode 中转让所有权。但是你应该将main更改为每次调用new来分配一个新的name对象。

【讨论】:

  • 非常感谢。这完全解决了问题。
猜你喜欢
  • 2022-10-20
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多