为什么我在c ++中的循环中得到相同的输出。
node* nn = (struct node*)malloc(sizeof(struct node));
for(int i=0;i<10;i++)
{
node* n = (struct node*)malloc(sizeof(struct node));
cout<<&n<<endl;
nn->next = n;
nn =n;
}
答案 0 :(得分:4)
因为你的n
变量是循环体的局部变量,所以它在每次迭代开始时创建,并在每次迭代结束时销毁。
显然,编译器决定为n
的每个版本重用相同的存储,这就是为什么它们都具有相同的内存地址。
请注意,&n
是 n
的地址,而不是其内容。你甚至不必初始化它。您拨打malloc
的电话无关紧要。
如果您想查看n
的值,则需要删除&
。
答案 1 :(得分:1)
您正在输出&n
n
的地址,而不是n
的内容,这可能是您想要的内容。
注意:问题是根据我的回答编辑的,但同样的问题仍然存在。
试试这个:
#include <iostream>
#include <cstdlib>
struct node {
node* next;
};
int main() {
node* nn = (struct node*)malloc(sizeof(struct node));
nn->next=nullptr;//Initialise so we can clean up nicely...
for(int i=0;i<10;i++)
{
node* n = (struct node*)malloc(sizeof(struct node));
n->next=nullptr;//Initialise so we can clean up nicely...
std::cout<<&n<<"=="<<n<<std::endl;
nn->next = n;
nn =n;
}
//Clean up after ourselves. Not relevant to the question but good practice.
while(nn!=nullptr){
node*n=nn;
free(nn);
nn=n;
}
return 0;
}
典型输出:
0x7ffda1be2058==0x55ffb0b9fc20
0x7ffda1be2058==0x55ffb0ba0c50
0x7ffda1be2058==0x55ffb0ba0c70
0x7ffda1be2058==0x55ffb0ba0c90
0x7ffda1be2058==0x55ffb0ba0cb0
0x7ffda1be2058==0x55ffb0ba0cd0
0x7ffda1be2058==0x55ffb0ba0cf0
0x7ffda1be2058==0x55ffb0ba0d10
0x7ffda1be2058==0x55ffb0ba0d30
0x7ffda1be2058==0x55ffb0ba0d50
实际输出可能会有所不同,原则上每次迭代都不需要编译器将n
存储在同一地址。我知道没有编译器没有。任何人吗?
注意:很少推荐在C ++中使用malloc()
。 malloc()
和free()
的直接替代是new
和delete
。在实践中使用std::unique_ptr<>
或其他自我管理构造。
答案 2 :(得分:0)
如何创建n个节点?禁止使用向量,因此我创建了n个节点的链接链表,但问题是我无法在循环中创建n个节点。
实际上,你的代码没有你想象的那么错误,只是你错过了一个重点:
nn->next = n;
使用此说明,您丢失了最后一个nn
指向的内容,并且您将无法重新获得它...
你需要的是第二个指向最初创建的元素的指针,所以你不会丢失列表头,因此不再丢失列表的其余部分:
node* nn = new node(); // this is the C++ way...
node* head = nn; // now you have a second pointer to the head...
for(int i=0;i<10;i++)
/* [...] */
现在,您可以通过head
指针访问您创建的所有节点(只要您不将其移离......)。
摆脱循环,只需使用struct * n = malloc(sizeof * n * 10); - David C. Rankin
另一种变体:直接创建10个元素...假设节点如下所示:
struct node
{
Data data;
node* next;
};
然后您只需
即可获得Data
的10个元素
Data* allData = new Data[10]; // again using the C++ way...
C ++ aproach还有另一个优点:当调用默认构造函数时,数组中的元素已经初始化(对于基本数据类型,请参阅here)。