这个指针赋值应该产生段错误?

时间:2012-05-08 04:22:53

标签: c++ pointers segmentation-fault

这不应该产生段错误吗? 当我运行代码时,输​​出为5.示例:http://ideone.com/gV2Nv

#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;
}

3 个答案:

答案 0 :(得分:3)

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

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

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

C ++标准第1.3.24节声明:

  

允许的未定义行为包括完全忽略不可预测的结果,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的文件化方式行事,终止翻译或执行(发布诊断信息)。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

当存储器地址超出范围时,从堆栈顶部弹出该存储器地址这一事实意味着它被释放,而不是被覆盖。这就是你得到输出“5”的原因。