返回首页 - 查找更多 -
主  题:
堆,栈,静态存储区的区别是什么?什么时候用?

迷糊中.....
回复人: kingeyetiger() ( ) 信誉:100 2002-09-21 09:07:05Z 得分:0
?

char *GetString(void)
{
    char *p = "hello world";
    return p;//函数结束时,p 的内存不释放吗?
}
void Test(void)
{
    char *str = NULL;
    str = GetString();
    cout<< str <<endl;
}
Top
回复人: breezeofveldt(比比) ( ) 信誉:94 2002-09-21 09:10:49Z 得分:5
?

up

Top
回复人: maoyujian() ( ) 信誉:97 2002-09-21 09:15:41Z 得分:20
?

char *p = "hello world";
这种是放在静态存储区中的,程序结束的时候就会释放。放在栈里的是你在函数里定义一个变量,他就是放在栈里,当这个函数返回的时候就释放了。堆里的是当你new出来的都是放在堆里的,当你调用delete或进程结束的时候释放。
Top
回复人: stonespace(stonespace) ( ) 信誉:140 2002-09-21 09:23:45Z 得分:75
?

char *p = "hello world";

p是一个指针变量,在函数返回的时候,属于p的四字节空间也释放了,但是p的值"hello world"指针指向静态存储区的一个空间,这个空间存储字符串,这个空间直到程序退出的时候才释放。
Top
回复人: stonespace(stonespace) ( ) 信誉:140 2002-09-21 09:29:37Z 得分:0
?

在stack中分配的空间,生存期和函数一次调用一样,每次函数调用时分配,返回时释放;静态存储区分配的空间生存期和整个程序一样长,程序启动时分配,退出时释放;heap中分配的空间最灵活,在运行malloc、new等的时候分配,free、delete释放,完全由程序逻辑自由控制。

选择在那里分配空间,主要看你要存储数据的生存期,选择最匹配的机制分配。用heap最灵活,但是效率最低,容易造成碎片,正确性也难保证。
Top
回复人: kingeyetiger() ( ) 信誉:100 2002-09-21 09:31:47Z 得分:0
?

stonespace(stonespace):
静态存储区是为每个程序单独分配的一块内存吗?

如果在函数内部分配的(如上例,噢,对了,这个"hello world"是在什么时候分配的?刚开始或者是执行到该语句时?),在结束时也不释放,那不是很浪费(如果大的话)?什么办法让它释放呢?
Top
回复人: kingeyetiger() ( ) 信誉:100 2002-09-21 09:33:45Z 得分:0
?

还没问就回答了,:)
Top
回复人: stonespace(stonespace) ( ) 信誉:140 2002-09-21 09:38:08Z 得分:0
?

"hello world"是字符串常量,通常是在程序开始的时候分配的。如果你不想占用空间,可以把字符串放在资源里,用LoadString等方法在需要的时候装入内存。
Top
回复人: kingeyetiger() ( ) 信誉:100 2002-09-21 09:41:12Z 得分:0
?

如果在很多函数里有字符串常量,那占用的空间就是它们的和了,那是不太好
我把它改为:char str[]="hello world"; 可以的是不是(就是说不会再浪费空间了)?
Top
回复人: stonespace(stonespace) ( ) 信誉:140 2002-09-21 09:53:33Z 得分:0
?

char str[]="hello world"; 

可能很编译器有关,在vc缺省设置下,你可以通过反汇编看到,"hello world"仍然被当作一个字符串常量,分配在静态存储区,然后在函数调用的时候,把这个字符串复制到str数组上,所以这样也不能节省空间,反而降低效率。

可能修改vc编译设置可以有另一种结果,我没试过。

Top
回复人: kingeyetiger() ( ) 信誉:100 2002-09-21 10:25:08Z 得分:0
?

这样呀,麻烦了,:(

Top

结贴 ,得分记录: breezeofveldt (5)、 maoyujian (20)、 stonespace (75)、