C++ 为什么在我的代码中用函数打印指针时,直接打印指针会给出不同的结果?

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:

这里怎么了? 为什么2个“cout”没有给出相同的结果

#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是当您输入function
s.push(10);
(不是在它后面,而是在它里面)。当您调用它时,堆栈上添加了一些数据,允许从函数返回(不重要,在
顶部
下用交叉单元格标记),接下来是函数的参数(传递的数字10),然后您的函数创建一个
节点项
,该节点项由两个变量组成,分别表示值和下一步的指针。作为
推送
函数的结果,
顶部
现在指向
下一步
的位置,而
下一步
指向0(即指针
下一步
等于0)

状态3就在您从
push
函数返回后,该函数的所有本地状态再次未定义(通常未触及,但未定义,无法保证任何内容)。请注意
top
仍指向未定义的内存位置


状态4是当您调用
cout next
node item;
生命周期太短,不值得。在函数末尾,您有一个指向列表中无效对象的指针。无论如何,您有未定义的行为,如在
push
中,您创建了一个局部变量
item
,然后在其上使用指针。但是,由于作为本地的,它被销毁并且不再有效,但您的指针仍然指向it@Alex拉里奥诺夫,好的,谢谢,我知道了,但为什么我的代码给出了不同的结果?未定义行为的行为是未定义的。有一天你可以得到你所期望的,而下一天计算机入侵五角大楼并发动核打击来消灭曼克嗨,这不是它的实际工作方式,请参考我的答案,尽管它可能有点难以理解;)函数指针的语法比这复杂得多。你太棒了,谢谢