程序在内存中存储详情(Text、Data、BSS、Heap、Stack....)

本文详细解析了程序运行过程中涉及的不同内存段的作用与管理方式,包括Text段、Data段、BSS段、Heap段和Stack段,并介绍了各类变量在这些内存区域中的分配与释放时机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看下面的一段程序:

char *string = "Hello World";
int iSize;

char *fun(void)
{
     char *p;
     iSize = 8;
     p = malloc(iSize);
    
return p;
}

存放的位置(相同的颜色对应)


Text段:上面标记为红色的部分(还包括整个fun函数,由于下边需要,所以没有标记)都存放在Text段,Text段用来存放代码(二进制文件)和常量,该段的数据通常是只读的

例:

char *p = "Hello";

p[0] = 'a';

 VC6.0下,编译无错,但运行是提示内存不可写,这就是因为"Hello"存放在Text段,它是只读的,你不能去修改它.


Data段: 已经初始化了的全局变量string就存放在该段,Data段用来存放初始化了的变量,即初始化了的全局变量和静态变量

 

BSS段: 未初始化的全局变量iSize存放在这,BSS段主要存放在未初始化的变量,即未初始化的全局变量和静态变量

 

Heap段: 程序员手动分配的malloc(iSize)这篇内存存放在该段,也需要用户自行释放

 

Stack段:函数里的局部变量*p存放在该段,Stack段主要存放局部变量、临时变量、函数相互调用的返回的地址,该段由编译器自行分配和释放

 

那接下来我们来看看,它们什么被分配了内存,什么时候释放内存:


全局变量和静态变量:程序开始的时候就分配了,程序结束时候释放内存。

局部变量:函数调用的时候为变量分配内存,调用结束释放内存。

堆里的:调用malloc时分配内存,调用free时释放。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值