【发布时间】:2021-06-05 20:19:34
【问题描述】:
考虑这段代码 -
#include<bits/stdc++.h>
using namespace std;
struct node{
char symbol;
node * left = NULL;
node * right = NULL;
};
node * somefn(node *ptr){
node temp;
node temp2;
temp.left = &temp2;
temp.symbol = 'b';
ptr = &temp;
return ptr;
}
int main(){
node *ptr;
ptr = somefn(ptr);
cout<<(ptr->symbol)<< "\n"; // this statement
if(ptr->left->left != NULL) cout<<"this shldnt print";
return 0;
}
当我执行这个保留第一个 cout 语句时,我得到输出 -
b
this shldnt print
但是,当删除第一个 cout 语句时,不会打印任何内容(第二个 cout 也不会)。为什么会出现这种不一致的行为? 我正在使用 gcc 版本 5.4.0。我什至在在线 ide 上尝试过这段代码,但同样的事情也发生了。
【问题讨论】:
-
somefn返回一个指向已被销毁的局部变量的悬空指针。通过访问生命周期已结束的对象,您的程序会表现出未定义的行为。 -
temp.left = &temp2;是一个错误,ptr = &temp;也是一个错误,当函数结束时,这两个对象都不再存在,但是您返回一个指向不存在对象的指针。
标签: c++ pointers null void-pointers