C++ 此指针分配应产生segfault?

C++ 此指针分配应产生segfault?,c++,pointers,segmentation-fault,C++,Pointers,Segmentation Fault,这不是应该产生一个断层吗? 当我运行代码时,输出是5。例如: #包括 使用std::cout; 使用std::endl; int*foo(INTA){ int b=a; int*c=&b; 返回c; } int main(){ int*a=foo(5); cout否,它应该导致未定义的行为。否,它应该导致未定义的行为。返回函数中局部变量的指针是未定义的行为 未定义的行为并不保证分段错误。它仅仅意味着任何行为都是可能的,并且程序可以以任何方式运行 一个常见的误解是,未定义的行为意味着代码应该产生分

这不是应该产生一个断层吗? 当我运行代码时,输出是5。例如:

#包括
使用std::cout;
使用std::endl;
int*foo(INTA){
int b=a;
int*c=&b;
返回c;
}
int main(){
int*a=foo(5);

cout否,它应该导致未定义的行为。

否,它应该导致未定义的行为。

返回函数中局部变量的指针是未定义的行为

未定义的行为并不保证分段错误。它仅仅意味着任何行为都是可能的,并且程序可以以任何方式运行

一个常见的误解是,未定义的行为意味着代码应该产生分段错误,事实是,在代码调用未定义的行为以及名称的情况下,标准不需要任何特定的行为

C++标准第1.3.24节规定:

允许的未定义行为范围从完全忽略情况和不可预测的结果,到在翻译或程序执行过程中以环境特有的记录方式(有或没有发出诊断消息)行为,再到终止翻译或执行(发出诊断信息)


返回函数中局部变量的指针是一种未定义的行为

未定义的行为并不保证分段错误。它仅仅意味着任何行为都是可能的,并且程序可以以任何方式运行

一个常见的误解是,未定义的行为意味着代码应该产生分段错误,事实是,在代码调用未定义的行为以及名称的情况下,标准不需要任何特定的行为

C++标准第1.3.24节规定:

允许的未定义行为范围从完全忽略情况和不可预测的结果,到在翻译或程序执行过程中以环境特有的记录方式(有或没有发出诊断消息)行为,再到终止翻译或执行(发出诊断信息)


当内存地址超出作用域时从堆栈顶部弹出,这一事实只意味着它被释放,而不是被覆盖。这就是为什么会得到输出“5”。
#include <iostream>
using std::cout;
using std::endl;

int* foo(int a) {
  int b = a;
  int* c = &b; 
  return c;
}

int main() {
  int* a = foo(5);
  cout << *a << endl; 
  return 0;
}