C++ 为什么在我的代码中用函数打印指针时,直接打印指针会给出不同的结果?
这里怎么了? 为什么2个“cout”没有给出相同的结果C++ 为什么在我的代码中用函数打印指针时,直接打印指针会给出不同的结果?,c++,C++,这里怎么了? 为什么2个“cout”没有给出相同的结果 #include<iostream> #include<string> using namespace std; template <class t> class stack{ private: struct node{ t val; node *next; }; public:
#include<iostream>
#include<string>
using namespace std;
template <class t>
class stack{
private:
struct node{
t val;
node *next;
};
public:
node *top;
stack(){
top = NULL;
}
void push(t v){
node item;
item.val = v;
item.next = top;
top = &item;
}
void printNext(){
cout << top->next <<endl;
}
};
int main(){
stack <int> s;
s.push(10);
cout << s.top->next << "\n";
s.printNext();
return 0;
}
#包括
#包括
使用名称空间std;
模板
类堆栈{
私人:
结构节点{
t值;
节点*下一步;
};
公众:
节点*顶部;
堆栈(){
top=NULL;
}
无效推力(t v){
节点项;
item.val=v;
item.next=顶部;
顶部=&项目;
}
void printNext(){
cout next指针可以打印函数或变量地址。得到的第二个数字是函数的地址。
我希望我回答了你的问题。如果你想更多地了解这件事,那就去吧
祝您度过美好的一天!参考您的程序堆栈的可能图片(不是您的堆栈,而是包含程序从头到尾的所有数据的堆栈)
:
第一种状态是在执行堆栈s
之后,它包含局部变量s
和堆栈对象的内容(即指针top
,现在指向NULL
)
状态2是当您输入functions.push(10);
(不是在它后面,而是在它里面)。当您调用它时,堆栈上添加了一些数据,允许从函数返回(不重要,在顶部
下用交叉单元格标记),接下来是函数的参数(传递的数字10),然后您的函数创建一个节点项
,该节点项由两个变量组成,分别表示值和下一步的指针。作为推送
函数的结果,顶部
现在指向下一步
的位置,而下一步
指向0(即指针下一步
等于0)
状态3就在您从push
函数返回后,该函数的所有本地状态再次未定义(通常未触及,但未定义,无法保证任何内容)。请注意top
仍指向未定义的内存位置
状态4是当您调用cout nextnode item;
生命周期太短,不值得。在函数末尾,您有一个指向列表中无效对象的指针。无论如何,您有未定义的行为,如在push
中,您创建了一个局部变量item
,然后在其上使用指针。但是,由于作为本地的,它被销毁并且不再有效,但您的指针仍然指向it@Alex拉里奥诺夫,好的,谢谢,我知道了,但为什么我的代码给出了不同的结果?未定义行为的行为是未定义的。有一天你可以得到你所期望的,而下一天计算机入侵五角大楼并发动核打击来消灭曼克嗨,这不是它的实际工作方式,请参考我的答案,尽管它可能有点难以理解;)函数指针的语法比这复杂得多。你太棒了,谢谢