c语言之内存分布

c语言程序,正常运行都需要内存资源,用来存放变量,常量,函数等代码,这些不同的内容存储的区域也是不同,且不同区域有不同特性。

  • 虚拟内存各个区域的分布:

  1. 栈内存:
  • 栈内存存放什么:

        ①环境变量

        ②命令行参数

        ③局部变量

  • 栈内存的特点:

        ①空间有限,尤其在嵌入式环境下。因此不可以用来存储尺寸太大的变量。

        ②每当一个函数被调用,栈就会向下增长一段,用以存储该函数的局部变量。(随用随申请,用完系统自动释放)

        ③每当一个函数退出,栈就会向上缩减一段,将该函数的局部变量所占内存归还给系统。

示例:

void fun(int a,int *b)
{
    int c;            //在函数fun的栈内存中分配
    ...               //fun结束时,系统栈内存向上缩进,释放空间 
}

int main()
{
    int m=100;        //在函数main的栈里分配
    fun(m,&m);        //调用fun函数时,系统的栈内存向下增长
    return 0;
}

 2、静态数据:

  • 全局变量:定义在函数外部的变量。
  • 静态变量:静态局部变量(定义在函数内部,且被static修饰的变量)静态全局变量(定义在函数外部,且被static修饰的变量)
int a;          //全局变量,退出整个程序前不会释放

int main(void)
{
    static int b;    //局部变量,退出整个程序前不会释放
    ...
}

注:

添加static的静态数据只能在本文件内使用,外部文件不能访问;

3、数据段与代码段:

  • 数据段细分为一下几个区域:

        ①.bss段:存放为初始化的静态数据,它们将被系统自动初始化为0;

        ②.data段:存放已初始化的静态数据;

        ③.rodata段:存放常量数据;

  • 代码段分为:

        ①.text段:存放用户代码

        ②.init段:存放系统初始化代码

int a;            //未初始化全局变量,存放在.bss段
static int b=100; //初始化了的全局静态变量,存放在.data段

4、堆内存:

  • 堆内存(heap)又被称为动态内存、自由内存,简称堆。
  • 堆是唯一可被开发者自定义的区段,开发者可以根据需要申请内存的大小、决定使用的时间长短等。但又由于这是一块系统“飞地”,所有的细节均由开发者自己把握,系统不对此做任何干预,给予开发者绝对的“自由”,但也正因如此,对开发者的内存管理提出了很高的要求。对堆内存的合理使用,几乎是软件开发中的一个永恒的话题。
  • 堆内存的特点:

        ①相比栈内存,堆的总大小仅受限于物理内存,在物理内存允许的范围内,系统对堆内存的申请不做限制。

        ②相比栈内存,堆内存从下往上增长。

        ③堆内存是匿名的,只能由指针来访问。

        ④自定义分配的堆内存,除非开发者主动释放,否则永不释放,直到程序退出。

  • 相关API

        ①、申请堆内存:malloc()/calloc()

        ②、 清零堆内存:bzero()

        ③、释放堆内存:free()

示例:

int a;
int *p=&a;
*p=malloc(sizeof(int));    //申请一块大小为sizeof(int)的堆内存
bzero(p,sizeof(int));      //清空刚申请的堆地址  
*p=100;                    //将整形数据100存入堆内存
free(p);                   //释放堆地内存


int *q=calloc(2,sizeof(int));    //申请二块大小为sizeof(int)的堆地址
                                 //calloc会自动清空堆地址

free(q);

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

biubiuboomy

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值