| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1266 人关注过本帖
标题:[求助]*p和p[]的求别
只看楼主 加入收藏
flyaway57
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-3-28
收藏
 问题点数:0 回复次数:22 
[求助]*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不会被释放吗?
谢谢各位了
搜索更多相关主题的帖子: void include 
2007-11-06 18:38
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 

char *GetMemory(void)
{
char p[] = "Hello";
return p;
}

p 的作用域仅限于 GetMemoru() 函数中。

p 是空链接的。

返回 p 是可以的,但 p 指向的那个字符串已经不存在了。因为函数已经结束了。
char p[] = "Hello"; 是进入函数后分配内存空间的,函数结束分配的内存空间释放了。


//------------------------//---------------------------------------------------//
// C 的 5 种存储类 //
//------------------------//

存储类 时期 作用域 链接 声明方式

自动 自动 代码块 空 代码块内,可选使用关键字auto
寄存器 自动 代码块 空 代码块内,使用关键字 register
具有外部链接的静态 静态 文件 外部 所有函数之外
具有内部链接的静态 静态 文件 内部 所有函数之外,使用关键字 static
空链接的静态 静态 代码块 空 代码块内,使用关键字 static


//----------------------------------------------------------------------------//

#include <stdio.h>

char * hello(void)
{
char p[] = "Hello"; /* p 是数组首元素的地址 */
/* 其实就是 p[6] = "Hello" */
return p;
}

char * hel(void)
{
char *p = "Hello"; /* p 指向一个字符串 */
return p;
}

int main(void)
{
printf("%s\n", hello());
printf("%s\n", hel());
getchar();
return 0;
}


/* char p[] = "Hello"; 这种形式只是为了方便初始化字符数组 */
/* 你不希望这样初始化吧:char p[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; */


[此贴子已经被作者于2007-11-9 13:32:27编辑过]


—>〉Sun〈<—
2007-11-06 18:54
monomania
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-16
收藏
得分:0 

如果光用释放掉了来解释?
那为什么用*p的时候,程序又没问题呢?


不好意思我只是想明白真相
2007-11-07 09:29
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 
p[] = "Hello"; ``这个是开辟内存空间```只在函数体内有效```


*p = "Hello";``这个是定义一个变量``用这个变量指向一个字符串``

两个P都不一样```一个是常量``一个是变量``

对P[]```程序结束后```开辟的内存P[]回释放```所以`字符串就不存在了``

对*p```程序结束后``指针变量p也回释放``但是p的地址是肯定存在的``所以返回的这个地址``是指向你要的字符串的``


这是我的个人想法```不知道有没有人来``给给标准答案```






女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2007-11-07 10:13
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 
p[] = "Hello": 函数返回时可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,函数返回时其原先的内容已经被清除,新内容不可知

char *p="hello"相当于const char *p="hello":使p指向一个常量字符串,这个字符串"hello"位于内存的静态存储区GetMemory返回的是指向这个常量字符串的指针,这个字符串并未被销毁,所以str指向的区域是确定的

英者自知,雄者自胜
2007-11-07 11:00
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 
char *p="hello":在堆栈内为指针变量p分配了空间,并在数据段内为字串"hello"分配空间。
char temp[]="hello":在堆栈内为指针变量temp分配空间的同时在堆栈内为字串"hello"也分配了空间。 在函数GetMemory()调用以后,堆栈内的数据将会被修改掉.
而数据段内的字串尚未被修改

英者自知,雄者自胜
2007-11-07 11:38
柒兲
Rank: 1
等 级:新手上路
威 望:1
帖 子:126
专家分:0
注 册:2007-9-26
收藏
得分:0 

你如果很想用数组的话
可以改成
char a[]={"hello"};
这样就对了

2007-11-07 12:32
monomania
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-16
收藏
得分:0 

请教:七楼的办法有什么根据?
我试了行不通.
谢谢


不好意思我只是想明白真相
2007-11-07 13:05
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
收藏
得分:0 
回6楼:

既然是用 *p="hello"; 会在静态存储区分配空间存放 "hello" ,同时会将"hello"的地址传给p,
那么函数返回时, p的空间会释放 hello的空间会不会释放?

如果会释放 那在返回主程序后str指向"hello",但这个"hello"所占的空间被系统回收,也就是说可以挪作他用。那以后再次使用str,所指向的内容还一定会是"hello"吗?会不会变成其他的内容?

如果不会释放 那多次调用这个getmemory()函数会不会造成系统资源流失?

人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-07 13:18
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
#include<stdio.h>


int main()
{
char * str;
char p[] "Hollo"; /* 你把这个放到函数中去干什么 */

str = p;
printf(str);
}

—>〉Sun〈<—
2007-11-07 13:31
快速回复:[求助]*p和p[]的求别
数据加载中...
 
   



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

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