求教
时间: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却能返回正确的值呢。
谢谢。。
{
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的值。
这就是我所理解的二者的区别。
而i作为一个整形变量,在返回的时候,系统会将i拷贝到一个无名变量中作为整形变量返回。所以能得到正确的i的值。
这就是我所理解的二者的区别。
作者: lxj5832 发布时间: 2011-12-22
引用 1 楼 lxj5832 的回复:
因为p是一个指针,代表一个地址,而这个地址上的内容是另外一片内存。在返回的时候系统会将地址所指向的内存中的数据销毁掉,而地址拷贝到一个无名对象中作为指针返回。这就像一栋房子,在拆迁的时候,将房子给拆了,但地址还在。所以虽然能得到正确的指针地址,但是该地址中已经没有内容了。
而i作为一个整形变量,在返回的时候,系统会将i拷贝到一个无名变量中作为整形变量返回。所以能得到正确的i的值。
这就是我所……
因为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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28