| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1266 人关注过本帖
标题:[求助]*p和p[]的求别
取消只看楼主 加入收藏
flyaway57
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-3-28
收藏
 问题点数:0 回复次数:1 
[求助]*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
flyaway57
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-3-28
收藏
得分:0 
#include <cstdio>

char* get_str()
{
char *str = {"abcd"};//可以
//char str[] = {"abcd"};//错误,结果不确定
return str;
}

int main()
{
char* p = get_str();
printf("%s ", p);

return 0;
}

char *str = {"abcd"};//可以,是因为"abcd"是一个字符串常量,它并不在一个栈空间上,而是在静态存储区上。
字符串的生命周期是:程序开始时分配,程序结束时释放。
(当然,str是一个指针变量,在栈空间上,因此函数返回时会释放,但是所指为字符串常量,字符串常量所占空间在函数返回时不会释放)

而char str[] = {"abcd"};//错误,结果不确定,虽然从编译器的实现来看(见如下代码(VC6下)的结果),"abcd"仍然是当成一个字符串常量,但是程序又把它复制了一次,放在了栈空间上,返回的时候str所指的是栈上的这一块字符串。问题的本质仍然是由于返回了指向栈空间的指针。

//5: char *str = {"abcd"};
//00401038 mov dword ptr [ebp-4],offset string "abcd" (0042201c)
//6: return str;
//0040103F mov eax,dword ptr [ebp-4]

//5: char str[] = {"abcd"};
//00401038 mov eax,[string "abcd" (0042201c)]
//0040103D mov dword ptr [ebp-8],eax
//00401040 mov cl,byte ptr [string "abcd"+4 (00422020)]
//00401046 mov byte ptr [ebp-4],cl
//6: return str;
//00401049 lea eax,[ebp-8]

这是我在其他地方看到的解释
就麻烦高手们给解释下这段汇编的意思了

戒骄戒躁
2007-11-08 01:41
快速回复:[求助]*p和p[]的求别
数据加载中...
 
   



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

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