变量的五大内存空间分配

本文介绍了程序变量的五个内存空间:栈区、堆区、全局区(静态区)、代码区和文字常量区。栈区由编译器自动分配和释放,用于局部变量和函数参数;堆区需手动申请和释放,如通过malloc/new操作;全局区分为已初始化和未初始化两个部分;代码区存储二进制代码;文字常量区存放const变量和字符串常量,数据只读。
摘要由CSDN通过智能技术生成

首先,程序变量的内存空间有五个:堆栈区(栈区)、堆区、全局区(静态区)、代码区、文字常量区

1、堆栈区(栈区)

堆栈区是一种老的叫法,由于堆栈区的操作方式和数据结构中的栈是类似(数据先进后出的结构),所以后面很多在称堆栈区的时候直接叫做栈区,所以其实堆栈区和栈区是一个意思。 堆栈区是又编译器自动分配和释放的,存放的内容是一些局部变量和函数的参数等。


2、堆区

堆区是自己申请的内存空间,C中使用malloc 来进行申请使用,使用delete来进行释放,C++中使用new/free来进行申请和释放,其实就是说只有自己去申请的变量才会存再堆区中。


3、全局区

全局区也叫静态区,非常好理解,在函数外的全局变量的数据存放区域,细化的又分为全局初始化区和全局未初始化区,即根据全局变量有没有进行初始化进行分类。


4、代码区

非常直观的可以理解为存放代码的二进制数据的区域,这里可以衍生一下内联函数为什么会需要更多的内存空间,因为内联函数会将使用到其自身的地方都进行展开,所以其实增加了代码区的内存使用。


5、文字常量区

文字常量区即存放一些const申明的变量或者字符串常量等

即如果在函数中有 char *p = "abcd";      //p存储在堆栈区、 “abcd\0”就是存储在常量区的

注意:

在文字常量区的数据是只读的,不能对其进行修改,常见的错误是关于野指针的:


  char *p = "hello world";  // hellow world 是存储在常量区的字符串
   *(p+1) = 'w'; //会导致程序崩溃 
printf("the p is: %s \n",p); 


下面是一个经典的例子:


  1. int a = 0;   //全局初始化区      
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值