为什么地址相同?



为什么每次循环运行时 temp 的地址(在 main 的 while 循环中(都相同 我正在尝试插入到链表中,然后显示然后输出中间元素,但最初在显示它时运行了一个无限循环,仅显示第一个元素。在插入和llist.add_ele_to_beg(&temp(后打印地址时;它每次都使用相同的地址!为什么会这样?

#include<iostream>
#include <unistd.h>
using namespace std;
class LinkedList;
class Node
{
private:
Node* next;
int value;
friend class LinkedList;
public:
Node(int ele) // constructor - declared in private section 
// to prevent other classes creating objects of this class, 
// only this class can create the object
{
next = nullptr;
value = ele;
}
};
class LinkedList
{
private:
Node* head;
public:
LinkedList()
{
head = nullptr;
}
void add_ele_to_beg(Node *temp)
{
// Node *temp = new Node(); // dynamically alloctg Node object
// temp->value = x;
temp->next = this->head;
this->head = temp;
}
void display()
{
Node *h = this->head;
while(h)
{
cout << h << endl;
cout << h->value << endl;
h = h->next; 
cout << h << endl;
cout << h->value << endl;
exit(0);
}
}
int findMiddle()
{
Node *fast, *slow = this->head;
if(!slow)
{
return -1;
}
if(!slow->next)
{
return slow->value;
}
if(!slow->next->next)
{
return slow->value;
}
// n > 2
fast = head->next->next;
while(1)
{
slow = slow->next;
if(!fast->next)
{
if(!fast->next->next)
{
fast = fast->next->next;
}
else
{
break;
}   
}
else
{
break;
}  
}
return slow->value;
}
};
int main()
{
LinkedList llist;
int n;
cout << "enter n" << endl;
cin >> n;
// create a dummy node
cout << "enter elements to be inserted in the beg" << endl;
int ele;
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)
}
llist.display();
cout << llist.findMiddle();
cout << endl;
return 0;
}

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

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

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

在插入和llist.add_ele_to_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)
}

因此,temp 是在堆栈之上创建的,然后你对它做一些事情,然后它超出了范围(所以被销毁了(,然后堆栈处于与循环迭代之前相同的状态。然后重复该过程。

看起来您可能打算做的是使用new分配一个新节点,以便在堆上创建对象。然后,您可以调用list.add_ele_to_beg()将其添加到列表中,并且该对象将存在于循环主体的末尾之后。

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

相关内容

  • 没有找到相关文章