社区
C语言
帖子详情
C/C++ 程序运行时内存空间分布
NewJerryj
2009-08-13 04:54:56
RT,例如堆,栈,静态全局区,非静态全局区等。最好给个图表形式
...全文
404
15
打赏
收藏
C/C++ 程序运行时内存空间分布
RT,例如堆,栈,静态全局区,非静态全局区等。最好给个图表形式
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 说明。
C/
C++
中的内存管理小结
但是对于空间的需求,不仅仅是上述的情况,有时候我们需要的空大小在
程序
运行时
才能知道,那此时静态的开辟空间的方式就不能满足了,我们这时候只能试试动态内存开辟。 这篇博客就来带大家梳理一下C/
C++
中的内存管理...
C/
C++
程序
内存的
分布
一、一个C/
C++
编译的
程序
占用内存分为以下几个部分: 栈区(stack):由编译器自动分配与释放,存放为
运行时
函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。 堆区(heap):一般...
《C语言/
C++
学习指南》Linux开发篇
本篇面向Linux初级、但已掌握C/
C++
基本语法的学员,以CentOS为演示平台,介绍Linux下的C/
C++
开发技术。在内容编排上,先介绍Linux的安装、基本使用和配置,然后再开始介绍在Linux下的C/
C++
开发技术: gcc命令行、...
C/
C++
程序
内存的分配
一、一个C/
C++
编译的
程序
占用内存分为以下几个部分: 栈区(stack):由编译器自动分配与释放,存放为
运行时
函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。 堆区(heap):...
c/
c++
内存管理详解
文章目录:c/
c++
内存
分布
C语言中的动态内存管理
c++
的内存管理operator new与operator delete函数 c/
c++
内存
分布
首先我们来看一看以下代码中变量在内存中的存储位置。 c/
c++
内存分配图: 1.栈又叫做堆栈,存储非...
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章