c语言堆栈内存

c基础存储结构

​ 一个程序本质上都是由.text段、.data段、.bss段三个组成的.

​ text段和data段都在可执行文件中(嵌入式系统一般时固化在镜像文件中),由系统从可执行文件加载.

​ bss段不在可执行文件中,由系统初始化.

在这里插入图片描述

在这里插入图片描述

1.静态区

程序结束后由系统释放。

1.1代码段

代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的(就是函数体里面的程序那部分)
text段:存放二进制代码;
               .rodata段:存放常量。
                代码区的大小在程序运行前就已经确定,该内存区域一般是只读的.

1.2未初始化数据段

全局变量

数据段就是程序中的数据,全局变量才算是程序的数据,局部变量不算程序的数据(它在栈上),只能算是函数的数据。
    data段:  存放已初始化的全局变量和静态变量;
              .bss段:存放未初始化的全局变量和静态变量;
                这一块的内存在程序编译时就已经分配好,在程序整个运行期间都存在。属于静态内存分配

2.动态区

2.1.堆

自由分配内存大小,malloc()动态开辟内存,使用后需要free();

用于存放在程序运行时被动态分配的内存段。堆的大小不固定,可以动态增加和减少。使用malloc()等函数动态分配内存到堆上,使用free()等函数释放对应的动态分配内存。堆的最大容量受限于系统中有效的虚拟内存。

2.2.栈

​ 用于存放程序运行时临时创建的局部变量,除此以外,被调用函数地址和其参数也会被压入发起调用的进程栈中,调用结束后,函数的返回值也会存放到栈中。程序执行后由系统释放。

栈的特点

1.运行时自动分配和自动回收性:栈是自动管理的,程序员不需要手工干预。方便简单。
2.反复使用性:栈内存在程序中其实就是那一块空间,程序反复使用这一块空间。
3.遗留性:栈内存由于反复使用,每次使用后程序不会去清理,因此在使用栈时还是上次栈中遗留下的数值。
4.临时性:函数不能返回栈变量的指针,因为这个空间是临时的.
5.溢出性:因为操作系统事先给定了栈的大小,如果在函数中无穷尽的分配栈内存总能用完
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值