| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 286 人关注过本帖
标题:对 《[求助]*p和p[]的求别》的解答
只看楼主 加入收藏
nianshi
Rank: 1
等 级:新手上路
帖 子:199
专家分:0
注 册:2007-11-7
收藏
 问题点数:0 回复次数:3 
对 《[求助]*p和p[]的求别》的解答

在C语言区看到这个问题,因为我是新手不能回复,所以我就把我的想法发表在这里,供大家参考:
下面是原题:
[求助]*p和p[]的求别
#include<stdio.h>
char *GetMemory(void)
{
char p[] = "Hello"; //如果把这里换成char *p = "Hello";就可以
return p;
}

int main()
{
char *str = NULL;
str = GetMemory();
printf(str);
}

为什么char p[] 的时候就不行,我看的解释是说在GetMemor定义的为局部变量,返回时p就已经释放,我有点不明白
换成*p为什么就可以了呢?难道那个时候指针p不会被释放吗?
谢谢各位了
解答:
这里如果用char p[] = "Hello"; return p; 那么返回的将是数组p的首地址,而退出Getmemory()后,数组p的空间就会被回收,所以在main()中就无法引用串Hello了。
而用char *p = "Hello";就可以 ,因为这样写内存中实际有两个空间:p有一个空间,常量“Hello”也占一个空间。
return p; 返回的是p的值也就是“Hello”空间的地址,退出后P空间回收了并不影响对“Hello”的引用,因为我们返回的是“Hello”空间的地址。
以上只是我自己的理解,公供参考。

搜索更多相关主题的帖子: 解答 
2007-11-07 12:01
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

返回的是个地址,可以根据这个地址值找到所要的东西.
但返回的是个局部变量数组,函数结束时是要被释放空间的.


倚天照海花无数,流水高山心自知。
2007-11-07 12:10
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
收藏
得分:0 

回2楼:
我不明白的是:既然如此,那Getmemory()函数在返回后,字符串"Hello"所占的空间是否系统也要回收? 如果回收的话,这段程序应该没有什么意义。如果不回收的话,这段空间是否就流失掉了。


人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-07 13:10
gbgame
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2007-10-27
收藏
得分:0 
可不可以这样解释:
char p[]="Hello";声明了一个数组,并在数组元素中保存了字符'H'、'e'、'l'、'l'、'o'、'\0',指针p指向数组首地址,当函数结束时,返回该地址,但由于数组的作用域仅在函数内部,所以函数结束后数组不复存在,以上的那些字符就丢失了。
而char *p="Hello";则声明一个指针指向字符串常量"Hello"的首地址,函数结束时返回该地址,因为常量在函数结束时不会因作用域限制而消失,所以通过函数返回的地址仍可找到字符串"Hello"。
2007-11-07 13:29
快速回复:对 《[求助]*p和p[]的求别》的解答
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016197 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved