+ -
当前位置:首页 → 问答吧 → 求教

求教

时间:2011-12-22

来源:互联网

char *GetMemory()
{
  char p[]="hello world";
  return p;
}
此时定义一个*str,str=GetMemory(),
因为返回时P申请的空间会释放掉,所以导致此函数无用。
请问为何
int num()
{
  int i=5;
  return i;
}
此时定义一个a,a=num(),
这个a却能返回正确的值呢。
谢谢。。

作者: dreamworldsky   发布时间: 2011-12-22

因为p是一个指针,代表一个地址,而这个地址上的内容是另外一片内存。在返回的时候系统会将地址所指向的内存中的数据销毁掉,而地址拷贝到一个无名对象中作为指针返回。这就像一栋房子,在拆迁的时候,将房子给拆了,但地址还在。所以虽然能得到正确的指针地址,但是该地址中已经没有内容了。
而i作为一个整形变量,在返回的时候,系统会将i拷贝到一个无名变量中作为整形变量返回。所以能得到正确的i的值。
这就是我所理解的二者的区别。

作者: lxj5832   发布时间: 2011-12-22

引用 1 楼 lxj5832 的回复:

因为p是一个指针,代表一个地址,而这个地址上的内容是另外一片内存。在返回的时候系统会将地址所指向的内存中的数据销毁掉,而地址拷贝到一个无名对象中作为指针返回。这就像一栋房子,在拆迁的时候,将房子给拆了,但地址还在。所以虽然能得到正确的指针地址,但是该地址中已经没有内容了。
而i作为一个整形变量,在返回的时候,系统会将i拷贝到一个无名变量中作为整形变量返回。所以能得到正确的i的值。
这就是我所……


那为何char *GetMemory()
{
  char *p="hello world";
  return p;
}
此时str=p就能返回正确的值呢?

作者: dreamworldsky   发布时间: 2011-12-23

那块内存是在栈区,当函数退出时仍然是有效的,但是如果你再调用个什么函数,原来p所指向的那块内存区域就会被覆写了。你试一下再调用一次其他的函数,你再打印出来,就是无效的了。

作者: logicouter   发布时间: 2011-12-23

还是有点迷糊的,就是关于指针的地方还是不懂。。。。

作者: yingzijuntuan   发布时间: 2011-12-23