Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的所有节点都指向同一个字符数组?_C++_Arrays_List_Pointers - Fatal编程技术网

C++ 为什么我的所有节点都指向同一个字符数组?

C++ 为什么我的所有节点都指向同一个字符数组?,c++,arrays,list,pointers,C++,Arrays,List,Pointers,我想知道我是否能在这个单链表问题上得到帮助 所以我有一个简单的结构,每个节点都有一个下一个指针和一个字符指针 struct node{ char * nodeName; node * next; } 在我的主函数中,我创建了一个名为name的动态分配字符数组,该数组将被发送到一个函数,该函数每次调用时都会创建一个新节点,用户每次都会输入一个新名称,并将其分配给创建的每个新节点,但由于某些原因,所有节点都使用输入的最终名称 我猜所有的

我想知道我是否能在这个单链表问题上得到帮助

所以我有一个简单的结构,每个节点都有一个下一个指针和一个字符指针

struct node{
          char * nodeName;
          node * next;
           }
在我的主函数中,我创建了一个名为name的动态分配字符数组,该数组将被发送到一个函数,该函数每次调用时都会创建一个新节点,用户每次都会输入一个新名称,并将其分配给创建的每个新节点,但由于某些原因,所有节点都使用输入的最终名称

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

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.

}
intmain()
{
char*name=new char[MAX_SIZE];//动态数组声明;
对于(int i=0;i<3;++i)//执行x次。
{
cout nodeName=“默认节点”;
}
节点*电流=头部;
node*newNode=新节点;
newNode->name=name;//分配用户输入的名称。
newNode->next=NULL//将下一个指针设置为NULL
while(当前->下一步)
当前=当前->下一步;//遍历到最后一个节点;
当前->下一步=新节点;//在末尾连接新节点。
}
代码确实创建了列表,但所有节点的名称都是相同的,即用户输入的最后一个字符数组。
有什么建议吗?

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

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

newNode->name = name;//assign user inputed name.
将每个节点的
名称
成员设置为相同的值。那不是你想做的

你想做什么取决于你没有向我们展示的代码。您可能希望在
addNode
中分配一些内存,将提供的名称复制到其中,然后将
newNode->name
设置到该指针。您必须修改代码以释放节点,以便在处理完该节点后释放该内存


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

您需要在addNode中复制name。最简单的方法是将nodeName设置为std::string或者,在循环中移动
char*name=new char[MAX\u SIZE]
。老实说,使用std::string确实是正确的方法。非常感谢。这完全解决了问题。