关于堆栈内存分配的问题

TomDebug 2005-10-06 09:41:46
比如有如下两段程序:
//program 1
#include <stdio.h>
#include <string.h>

char *back(void)
{
char name[]="xxxxxxx";
return name;
}

void main()
{
char name[10];
strcpy(name,back());
puts(name);
getchar();
}

//program 2

#include <stdio.h>
#include <string.h>

char *back(void)
{
char *name="xxxxxxx";
return name;
}

void main()
{
char name[10];
strcpy(name,back());
puts(name);
getchar();
}

细心你就会发现program2只是把program1中的局部变量name换成了一个指针,结果就能正确打印出来了,我不明白为什么,我知道program1中的name为局部数组变量,运行完空间会自动释放,那指针变量难道就没有申请空间吗,局部变量,返回地址都是放在stack中的啊,难道他们的返回地址就不同吗?
多谢!!!
...全文
501 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoner 2005-10-07
  • 打赏
  • 举报
回复
呵呵,提个想法,对于这种问题可否通过在VC下单步跟踪一下程序,仔细看看内存状态来分析?
xlsue 2005-10-07
  • 打赏
  • 举报
回复
找板凳来座,听各位论道先:)
  • 打赏
  • 举报
回复
2是安全的, 木有移植性方面的问题, 不过返回的字符串是不能被改写地.
yujia_myc 2005-10-07
  • 打赏
  • 举报
回复
先介绍你看东西,上海贝尔林锐博士的关于编写高质量的C/C++方面的电子文档,对于你目前的层次很有帮助

给分哦
hawk_1982 2005-10-06
  • 打赏
  • 举报
回复
program 1里函数里的变量是创建在栈上的,函数结束,所有变量销毁,返回的只是name[]首地址的值,现在这个地址里的值已经不可知.
program 2的指针是创建在栈上,指向一个字符串,指针里的值是一个静态数据空间的地址,因为字符串是创建在静态数据空间的,函数返回指针里的值,当函数结束时,创建在栈上的指针被销毁,而在静态数据空间上的字符串并没有被销毁.但这个字符串地址随时可能被使用,从而覆盖掉原来的内容.

TomDebug 2005-10-06
  • 打赏
  • 举报
回复
回小小:
指针的作用域失效,以为着在别的地方对相同名字的指针进行操作不会对作用域内的指针有影响,与作用域内的指针返回地址为什么无关,我想了一下, chan name[] 与char *name应该都是在stack中被分配的,只是他们的初始化方式不同,数组初始化是一个拷贝过程,与原来的字符串常量没有关系,而指针则始终都指向字符串常量,尽管*name在stack中,但他返回的地址是静态区
晨星 2005-10-06
  • 打赏
  • 举报
回复
>>是不是在某个函数里定义的指针变量
>>当退出这个函数时系统不会回收这个指针
>>这个指针的作用域是不是从定义它的地方起到程序结束???
当然不是,指针变量首先是个变量,变量的所有性质,它也一样。
晨星 2005-10-06
  • 打赏
  • 举报
回复
char name[]="xxxxxxx";
完全等价于:
char name[8]="xxxxxxx";
几乎等价于:
char name[8];
strcpy(name, ="xxxxxxx");

这还不明白吗?能跟char* name = "xxxxxxx"一样吗?
晨星 2005-10-06
  • 打赏
  • 举报
回复
>>我说的是为什么不写成static char *name,不是char *name=static "xxxxxxx";
问题是name和"xxxxxxx"是两个东西,不是一个,"xxxxxxx"就是保存在静态存储区中,而name不是,它保存在stack中。name只是暂时指向了"xxxxxxx",待会儿还可能指向别的地方。而"xxxxxxx"所代表的,就是它自己。
你说的“static char *name”跟你问的问题根本不是一回事。
不管是
static char *name = "xxxxxxx";
还是
char *name = "xxxxxxx";
都不影响"xxxxxxx"被保存在静态存储区中,所不同的仅仅是指针变量name本身被保存的位置,而这个跟你的问题无关。

>>数组和指针不都是返回地址吗?
这没错,但是我前面也解释过了,在你的第一个程序中,所返回的地址是那个局部数组本身的地址;而在你的第二个程序中,所返回的是被指针变量name所指向的那个静态存储区中的地址。
数组名虽然也是个地址,但数组不等于指针变量。
Shining 2005-10-06
  • 打赏
  • 举报
回复
这个情况,仅在Windows中吧~~~
ratzip 2005-10-06
  • 打赏
  • 举报
回复
借贵地问个问题

是不是在某个函数里定义的指针变量

当退出这个函数时系统不会回收这个指针

这个指针的作用域是不是从定义它的地方起到程序结束???
TomDebug 2005-10-06
  • 打赏
  • 举报
回复
请楼上的说清楚
其中的原因
codearts 2005-10-06
  • 打赏
  • 举报
回复
1和2这种写法都是错误的,不同的编译器和OS会有不同的结果
TomDebug 2005-10-06
  • 打赏
  • 举报
回复
我明白用HEAP更安全些
请问指针变量是分配在HEAP中的吗?
jhLin 2005-10-06
  • 打赏
  • 举报
回复
感觉应该不会丢失,既然是全局静态变量,地址就是固定的,怎么会丢失呢。。。
TomDebug 2005-10-06
  • 打赏
  • 举报
回复
数组和指针不都是返回地址吗?
从返回地址的角度来考虑,为什么char name[]就不可以呢?
它返回的地址已经不再是那个字符串常量了吗?
为什么static char name[]就可以了呢?

对了,我说的是为什么不写成static char *name,不是char *name=static "xxxxxxx";
晨星 2005-10-06
  • 打赏
  • 举报
回复
楼主的误解在于觉得他们很相似,而实际上恰恰是区别太大了。
晨星 2005-10-06
  • 打赏
  • 举报
回复
To:yll1986
为什么随时会丢失?
晨星 2005-10-06
  • 打赏
  • 举报
回复
是啊,32位系统中所有的指针变量都是4个字节,不管是char型的,还是int型的,double型的,甚至是指向某种自定义类型的指针。
因为指针变量的内容就是个内存地址,32位系统中,内存地址就是32位的,所以是4个字节。
yll1986 2005-10-06
  • 打赏
  • 举报
回复
其实program2只是看上去好象数据没丢失,但代价是数据随时会丢失,所以从可维护性的角度来讲program2的写法更危险.
加载更多回复(5)

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧