首页 > 返回在被调用函数中声明的指针会发生什么?

返回在被调用函数中声明的指针会发生什么?

例如程序:

c#include <stdio.h>

int *return_sth()
{
  int tmp = 5;
  int *ptr = &tmp;

  return ptr;
}

int main(void)
{
  printf("%p, %d\n", return_sth(), *return_sth());

  int tmp = 10;
  int *ptr2 = &tmp;

  printf("%p, %d\n", ptr2, tmp);

  return 0;
}

运行结果:

$ ./a.out 
0x7ffc5e2c6274, 5
0x7ffc5e2c6294, 10

很明显, 在return_sth()返回之后, *ptr是未定义的, 那么ptr呢?
仍然存在还是一样是未定义的?


这个例子时说: 指针被回收,是存指针的内存可以重新分配,但指针本身存储的值(如函数中的tmp的地址)没变。
局部变量存在栈中,由编译器自动清除。
那么,如果编译器的内存管理不同,本例的结果也不同吗?
栗子,设ptr地址0x100,tmp地址0x104
1. 编译器A回收内存的处理是ptr=NULL,0x100这块内存里的值仍然为0x104,那可以由(0x100)得到tmp的值
2. 编译器A回收内存的操作类似delete ptr; ptr=NULL,那么0x100这块内存不指向0x104了吧,那么
(0x100)就不能再得到tmp的值了。
第二种方式似乎更安全些,但是实际结果好像不是酱紫。求解答?


printf("%p, %d\n", return_sth(), *return_sth());

中,return_sth()返回ptr的值,也就是一个地址,虽然与int不匹配,但编译器只会发出警告,但实际上还是一个地址,所以*return_sth()就是对这个地址解引用,当然也就是5了,不过你这程序看起来实在没什么意思


ptr的值就是tmp的地址,int *ptr = &tmp;以后ptr值就确定了,就像int retval = 100; return retval;一样,不存在未定义的问题。

【热门文章】
【热门文章】