是否释放了局部变量的地址?

时间:2013-10-30 11:39:52

标签: c++

int *intAddr(){
  int i = 16;
  return &i;
}

char *charAddr(){
  char A = 'a';
  return &A;
}

然后我通过

测试这两个功能
int *intaddr = intAddr();printf("%d\n", *intaddr);
char *charaddr = charAddr();printf(charaddr);

但结果是只有16个不是'a'。当函数intAddr()结束时,变量i被破坏。为什么*intaddr可以获得16?

4 个答案:

答案 0 :(得分:4)

不应该返回一个指向函数local的变量的指针。这是不明确的行为。不要做。 EVER !!

原因是你的函数退出时你的本地变量i被破坏,所以你的函数退出后的指针将指向最多包含垃圾的内存。

答案 1 :(得分:1)

访问指向已销毁元素的内存会调用未定义的行为。未定义的将会发生,如果您多次运行代码,很可能会发生不同的事情。你上面所做的与顺便访问任何地址没什么不同。

答案 2 :(得分:0)

这只是undefined behavior您只返回自动变量的地址,因此一旦函数退出就不会存在。 未定义的行为可能会发生任何事情,但它不可靠。从草案C ++标准部分6.7 声明声明段落 2 说:

  

每次执行声明语句时,都会初始化具有自动存储持续时间(3.7.3)的变量。块中声明的具有自动存储持续时间的变量在从块(6.6)退出时被销毁。

答案 3 :(得分:0)

更改此

int *intAddr(){
int i = 16;
return &i;}

int *intAddr(){
int* i = new int(16);
return i;