# 关于进程的地址空间:TEXT,DATA,BSS,HEAP,STACK

现代操作系统对每个进程都分配了完整的虚拟内存地址空间。进程会把整个地址空间分成多个区间来使用。 程序员最为熟悉的两个区间莫过于堆和栈。然而还有其他的内存区间来存储代码、静态、全局变量等等。 本文来总结一下这些内存区间到底存的是哪些东西。先看图:
请添加图片描述
虚拟内存技术使得每个进程都可以独占整个内存空间,地址从零开始,直到内存上限。 每个进程都将这部分空间(从低地址到高地址)分为六个部分:

TEXT段:整个程序的代码,以及所有的常量。这部分内存是是固定大小的,只读的。
DATA段,又称GVAR:初始化为非零值的全局变量。
BSS段:初始化为0或未初始化的全局变量和静态变量。
HEAP(堆空间):动态内存区域,使用malloc或new申请的内存。
未使用的内存。
STACK(栈空间):局部变量、参数、返回值都存在这里,函数调用开始会参数入栈、局部变量入栈;调用结束依次出栈。

其中堆空间和栈空间的大小是可变的,堆空间从下往上生长,栈空间从上往下生长。

由于常量存储在TEXT段中,所有对常量的赋值都将产生segment fault异常。

可以认为BSS段中的所有字节都是0。因为未初始化的全局变量、静态变量都在BSS段中, 所以它们都会被初始化为0,同时类的成员变量也会被初始化为0,但编译器不保证局部变量的初始化。

上面说栈(STACK)是从上到下(高地址到低地址)分配的,而且我们知道, 函数的局部变量的空间是在进入函数体后才分配的,在栈空间里。

来个例子来看看吧!

int main(){
char a=0, b=0;
int p = (int)&b;
*p = 258;
printf("%d %d", a, b);
return 0;
}
输出是

1 2
a, b属于局部变量,存储在栈空间中,先分配a的地址,再分配b的地址。因为栈是从上往下生长的,所以b的地址比a低一个字节。 然后对b的地址进行赋值258(int是4字节,十六进制表示是0x00 00 01 02)。最后1字节0x02赋值给了b,接下来1字节0x01赋值给了a。

来源于:链接

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值