【c语言基础必备】c程序的存储空间布局

本文详细阐述了C语言程序在存储空间中的布局,包括正文段、初始化数据段、未初始化数据段、栈和堆。栈主要用于存放局部变量和函数调用信息,堆则进行动态存储分配。此外,还讲解了全局变量、静态变量和常量在数据区的位置,并通过代码示例解释了堆的使用。
摘要由CSDN通过智能技术生成

一、正文段。可执行程序在存储空间的的副本,cpu执行的机器指令部分。

二、初始化的数据段。它包含明确地赋初值的变量。如: int a = 1; 此变量放于数据段。

三、未初始化的数据段。 内核将此段中的数据初始化为0或者空指针。出现在任何函数外的c声明 ,long sum[1000];此变量存放在非初始化数据段中。

四、栈。每次函数调用时,其返回地址以及调用者的环境信息都存放在栈中。最近被调用的函数在栈上为其自动和临时变量分配存储空间。每次函数调用结束后,系统会自动收回内存。(见下面的程序1说明)

五、通常在堆中进行动态存储分配。每次函数被调用结束后,系统不会收回内存。如下图所示:


https://img-my.csdn.net/uploads/201204/13/1334298242_4690.jpg


栈主要用来存放局部变量, 传递参数, 存放函数的返回地址.esp 始终指向栈顶, 栈中的数据越多, esp的值越小.
堆用于存放动态分配的对象, 当你使用 malloc , new 等进行分配时,所得到的空间就在堆中. 动态分配得到的内存附带有分配信息, 所以你能够 realloc 和 free调它们.
全局,静态和常量是分配在数据区中的。数据区包括bss和初始化区。
堆向高内存地址生长
栈向低内存地址生长
堆和栈相向而生,堆和栈之间有个临界点,称为stkbrk
CODE:
进程在内存中的影像.
      我们假设现在有一个程序, 它的函数调用顺序如下.
      main(...) ->; func_1(...) ->; func_2(...) ->; func_3(...)
      即: 主函数main调用函数func_1; 函数func_1调用函数func_2; 函数func_2调用函数func_3
      当程序被操作系统调入内存运行, 其相对应的进程

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值