C语言的内存布局

C语言内存布局

在这里插入图片描述
了解C程序中的内存布局,会起到事半功倍的效果。

C程序的内存布局包含五个段,分别是STACK(栈段),HEAP(堆段),BSS(以符号开头的块),DS(数据段)和TEXT(文本段)。每个段的读写都有自己的相应权限和空间。如果不按相应的方式访问,就会发生coredump。

High Addresses ---> .----------------------.
                    |      Environment     |
                    |----------------------|
                    |                      |   Functions and variable are declared
                    |         STACK        |   on the stack.
base pointer ->     | - - - - - - - - - - -|
                    |           |          |
                    |           v          |
                    :                      :
                    .                      .   The stack grows down into unused space
                    .         Empty        .   while the heap grows up. 
                    .                      .
                    .                      .   (other memory maps do occur here, such 
                    .                      .    as dynamic libraries, and different memory
                    :                      :    allocate)
                    |           ^          |
                    |           |          |
 brk point ->       | - - - - - - - - - - -|   Dynamic memory is declared on the heap
                    |          HEAP        |
                    |                      |
                    |----------------------|
                    |          BSS         |   Uninitialized data (BSS)
                    |----------------------|   
                    |          Data        |   Initialized data (DS)
                    |----------------------|
                    |          Text        |   Binary code
Low Addresses ----> '----------------------'

  1. 它位于较高的地址,与堆段的增长和收缩方向正好相反。
  2. 函数的局部变量存在于栈上
  3. 调用函数时,将在栈中创建一个栈帧。
  4. 每个函数都有一个栈帧。
  5. 栈帧包含函数的局部变量参数和返回值。
  6. 栈包含一个LIFO结构。函数变量在调用时被压入栈,返回时将函数变量从栈弹出。
  7. SP(栈指针)寄存器跟踪栈的顶部。
int main()
{
	int i;
	//局部变量,所以在栈上
	return 0;
}

  1. 用于在运行时分配内存。
  2. 由内存管理函数(如malloc、calloc、free等)管理的堆区域,这些函数可以在内部使用brk和sbrk系统3. 调用来调整其大小。
  3. 堆区域由进程中的所有共享库和动态加载的模块共享。
  4. 它在堆栈的相反方向上增长和收缩。
int main(){
	int ptr* = (int *)malloc(sizeof(int));//在堆空间上
}

BSS(未初始化的数据块)

  1. 包含所有未初始化的全局和静态变量。
  2. 此段中的所有变量都由零或者空指针初始化。
  3. 程序加载器在加载程序时为BSS节分配内存。
int main(void) {
    static int data2;  // 未初始化的静态变量存储在BSS段
    return 0;
}

DS(初始化的数据块)

  1. 包含显式初始化的全局变量和静态变量。
  2. 此段的大小由程序源代码中值的大小决定,在运行时不会更改。
  3. 它具有读写权限,因此可以在运行时更改此段的变量值。
  4. 该段可进一步分为初始化只读区和初始化读写区。

int main(void) {
    static int data2 = 3;  //初始化的静态变量存储在DS段
    return 0;
}

TXT

  1. 该段包含已编译程序的二进制文件。
  2. 该段是一个只读段,用于防止程序被意外修改。
  3. 该段是可共享的,因此对于文本编辑器等频繁执行的程序,内存中只需要一个副本。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不好,商鞅要跑

谢谢咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值