C/C++ 程序运行时内存空间分布

NewJerryj 2009-08-13 04:54:56
RT,例如堆,栈,静态全局区,非静态全局区等。最好给个图表形式
...全文
404 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovey1314 2009-10-31
  • 打赏
  • 举报
回复
char* func()
{
char* str="hello";
return str;
}
str是在栈里,由于"hello"在字符常量区,那么给str分配的空间只是一个指针的大小,用来存储"hello"在字符常量区的地址,字符常量区生存周期是整个程序的生命周期。因此返回的地址是存在的,同返回一个int型变量相同,把地址的值拷贝给一个临时指针对象返回。不同于返回局部变量的地址,因为如果定义了一个局部变量 char a;cin>>a;return &a;就会出错,因为返回的地址是a的地址,它是局部变量,函数调用后会销毁,不能够返回正确的地址。
netxuning 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 newjerryj 的回复:]
感谢楼上两位,有个问题:
    在子函数中,
          char* func()
        {
            char* str="hello";    //也是在堆中,这样需要释放吗?
            return str;
        }

[/Quote]

str和"hello"并不在堆中,str分配在栈中,不需要释放;"hello"在文字常量区,也不需要释放,如果释放linux下会产生invalid pointer的错误!

#include <stdio.h>

int
main()
{
char *str = "hello";
int a;
printf("0x%x 0x%x\n", &str, str);
printf("0x%x\n", &a);
//free(str); 运行期错误
}

运行后:
0xbfb765a0 0x80484e0
0xbfb7659c

可以看到变量str和相隔4个字节,是连续分配的,都在栈区,而"hello"则在遥远的文字常量区,地址相差很多!
antss 2009-08-14
  • 打赏
  • 举报
回复
怎么才可以添个图上来?
zhangyq73 2009-08-13
  • 打赏
  • 举报
回复
new分配的空间在自由存储区
plkyes 2009-08-13
  • 打赏
  • 举报
回复
应该是在栈里面吧
jinwei1984 2009-08-13
  • 打赏
  • 举报
回复
-----
| 堆栈段 | <-------高地址
-----
| 空洞 |
-----
| 堆 |
-----
| BSS段 |
-----
| 数据段 |
-----
| 文本段 |
-----
| 空洞 | <----------低地址
------

以上是内存布局
一般情况,堆栈段向下增长,即由高地址到低地址,堆向上增长

BSS段和数据段整个称为 数据区

数据段: 包括初始化的全局和静态变量
BSS: 未初始化的全局和静态变量,一般只记录大小
堆: malloc等分配的
堆栈段:局部变量,函数调用时的参数,活动记录等等一些信息

具体可参考C专家编程
NewJerryj 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 newjerryj 的回复:]
引用 5 楼 sun_hw 的回复:
>> char* str="hello";   
在栈里,没有new出来怎么会在堆里呢?

char* str= new char[10];//需要释放,在堆里   


对于char* str="hello";

我看地址,str确实是在堆里啊.而且如果是在栈里,那我子函数调用结束后,str岂不是挂了?怎么能正确返回咧?
[/Quote]

我错了,应该是在栈里面。
zbihong 2009-08-13
  • 打赏
  • 举报
回复
学习!
NewJerryj 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sun_hw 的回复:]
>> char* str="hello";   
在栈里,没有new出来怎么会在堆里呢?

char* str= new char[10];//需要释放,在堆里   
[/Quote]

对于char* str="hello";

我看地址,str确实是在堆里啊.而且如果是在栈里,那我子函数调用结束后,str岂不是挂了?怎么能正确返回咧?
efenwu 2009-08-13
  • 打赏
  • 举报
回复
MARK
sun_hw 2009-08-13
  • 打赏
  • 举报
回复
>> char* str="hello";
在栈里,没有new出来怎么会在堆里呢?

char* str= new char[10];//需要释放,在堆里
pengzhixi 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 newjerryj 的回复:]
感谢楼上两位,有个问题:
    在子函数中,
          char* func()
        {
            char* str="hello";    //也是在堆中,这样需要释放吗?
            return str;
        }

[/Quote]
hello是字符串常量来着。它不是存放在堆区。而str本身存放在栈区。不需要你释放。
记住,有malloc才会有free,有new才会有delete
NewJerryj 2009-08-13
  • 打赏
  • 举报
回复
感谢楼上两位,有个问题:
在子函数中,
char* func()
{
char* str="hello"; //也是在堆中,这样需要释放吗?
return str;
}
lijian22500 2009-08-13
  • 打赏
  • 举报
回复
http://www.laogu.com/news/upload/img/2006_9_14_14_44_45_2.gif
antss 2009-08-13
  • 打赏
  • 举报
回复
堆,是动态分配的。需要动态释放。

栈是系统分配的,生存期在使用完后,自动销毁。

静态全局区,其实你只要真的了解static的作用就知道了。用static修饰的变量,作用域是所在的整个源文件。

其它源文件无法访问。

非静态全局,可以跨源文件,但使用处需要用extern 说明。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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