C++ 为什么地址是一样的?

C++ 为什么地址是一样的?,c++,memory,linked-list,C++,Memory,Linked List,为什么每次循环运行时temp(在main的while循环中)的地址都是相同的 我试图插入到一个链表中,然后显示,然后输出中间的元素,但最初在显示它时,只在第一个元素中运行了一个无限循环displayint。在插入和插入后打印地址时。将“ele”添加到“beg”(&temp);每次都是同一个地址!为什么会这样 #包括 #包括 使用名称空间std; 类链接列表; 类节点 { 私人: 节点*下一步; int值; 朋友类链接列表; 公众: Node(int ele)//构造函数-在私有部分声明 //要防

为什么每次循环运行时temp(在main的while循环中)的地址都是相同的 我试图插入到一个链表中,然后显示,然后输出中间的元素,但最初在显示它时,只在第一个元素中运行了一个无限循环displayint。在插入和插入后打印地址时。将“ele”添加到“beg”(&temp);每次都是同一个地址!为什么会这样

#包括
#包括
使用名称空间std;
类链接列表;
类节点
{
私人:
节点*下一步;
int值;
朋友类链接列表;
公众:
Node(int ele)//构造函数-在私有部分声明
//要防止其他类创建此类的对象,
//只有此类才能创建对象
{
next=nullptr;
值=ele;
}
};
类链接列表
{
私人:
节点*头;
公众:
LinkedList()
{
水头=零PTR;
}
无效将元素添加到元素(节点*临时)
{
//Node*temp=new Node();//动态分配节点对象
//温度->值=x;
温度->下一步=此->头部;
这个->头=温度;
}
无效显示()
{
节点*h=此->头部;
while(h)
{
(下一步)
{
返回慢->值;
}
//n>2
快速=头部->下一步->下一步;
而(1)
{
慢=慢->下一步;
如果(!快速->下一步)
{
如果(!快速->下一步->下一步)
{
快速=快速->下一步->下一步;
}
其他的
{
打破
}   
}
其他的
{
打破
}  
}
返回慢->值;
}
};
int main()
{
链接主义者;
int n;
cout n;
//创建虚拟节点
库特埃勒;
Node temp(ele);//创建obj节点并初始化
list.add_ele_to_beg(&temp);//发送要更改的节点地址
库特
为什么每次循环运行时temp(在main的while循环中)的地址都是相同的

因为您获得的对象地址具有自动存储持续时间。这意味着对象生存期在创建它的块结束时结束(在您的例子中是循环结束),之后您有悬空指针。由于在对象生存期结束后被视为空闲的内存,编译器出于实际目的再次重用相同的内存(这不是必须的,但它可以而且有意义)

要使其正常工作,您应该创建具有动态存储持续时间的对象,这意味着您可以控制对象的生存期。您可以使用运算符
new
,但最好使用智能指针而不是原始指针,并让它管理对象生存期。在这种情况下,您应该使用
std::make_unique
std::make_共享
取决于您想要什么样的所有权。您可以在此处找到有关如何进行共享的详细信息

为什么每次循环运行时temp(在main的while循环中)的地址都是相同的

因为您获得的对象地址具有自动存储持续时间。这意味着对象生存期在创建它的块结束时结束(在您的例子中是循环结束),之后您有悬空指针。由于在对象生存期结束后被视为空闲的内存,编译器出于实际目的再次重用相同的内存(这不是必须的,但它可以而且有意义)

要使其正常工作,您应该创建具有动态存储持续时间的对象,这意味着您可以控制对象的生存期。您可以使用运算符
new
,但最好使用智能指针而不是原始指针,并让它管理对象生存期。在这种情况下,您应该使用
std::make_unique
std::make_共享
取决于您想要什么样的所有权。您可以在此处找到有关如何进行共享的详细信息

在插入和llist后打印地址时。将\u ele\u添加到\u beg(&temp);每次打印的地址都相同!为什么会发生这种情况

之所以发生这种情况,是因为
temp
是一个局部变量,因此它存在于堆栈上,并且每次通过循环在同一位置创建和销毁同一组局部变量:

while(n--)
{
    cin >> ele;
    Node temp(ele); // obj node created and ctor initialises
    llist.add_ele_to_beg(&temp); // sending address of node to make change to 
    cout << &temp << endl;
    // node (passing by reference)
}
while(n--)
{
cin>>ele;
Node temp(ele);//创建obj节点并初始化
list.add_ele_to_beg(&temp);//发送要更改的节点地址
库特
在插入和llist后打印地址时。将\u ele\u添加到\u beg(&temp);每次打印的地址都相同!为什么会发生这种情况

之所以发生这种情况,是因为
temp
是一个局部变量,因此它存在于堆栈上,并且每次通过循环在同一位置创建和销毁同一组局部变量:

while(n--)
{
    cin >> ele;
    Node temp(ele); // obj node created and ctor initialises
    llist.add_ele_to_beg(&temp); // sending address of node to make change to 
    cout << &temp << endl;
    // node (passing by reference)
}
while(n--)
{
cin>>ele;
Node temp(ele);//创建obj节点并初始化
list.add_ele_to_beg(&temp);//发送要更改的节点地址

cout您可以在每个循环周期中使用
new Node()
创建新元素。

您可以在每个循环周期中使用
new Node()
创建新元素。

temp
需要是动态分配的指针变量(例如,使用
malloc
)而不是本地。为什么您认为每次都应该不同?
temp
需要是动态分配的指针变量(例如使用
malloc
),而不是本地。为什么您认为每次都应该不同?