C++数据存储问题以及一些扩展

本文详细解析了C++中不同的内存区域,包括栈、堆、全局/静态存储区、常量存储区和代码区的功能与使用场景。阐述了局部变量、new分配内存、静态变量、常量及代码的存储位置,以及它们的初始化与回收机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 栈:用来保存局部变量,作用域结束的时候自动回收(汇编中通过保存栈顶指针,结束的时候直接将栈针赋值成栈顶指针)
  2. 堆:保存new分配的内存,或者malloc,alloc分配的,需要程序员手动释放,delete或者free,当然,实在忘记了,整个程序文件结束时,操作系统会将之回收,操作系统有个功能可是内存管理
  3. 全局/静态存储区:全局变量和static后的变量存储的地方。static之后的有全局静态变量局部静态变量,static修改标识符的链接属性,由默认的external变为internal。局部静态变量如果没有进行初始化,则默认为0,而自动变量没有初始化则是随机值
    1. 对于“分配内存”,由于局部静态变量存储在全局存储区,故应在程序执行前,编译时分配内存。
      对于“初始化”,《C++Primer(5th)》(中文版185页)原话:局部静态变量在程序的执行路径第一次经过对象定义语句时初始化。
  4. 常量存储区:分成字面量,const常量,不允许修改。字面量 “abc”,const常量const int a = 5;必须初始化
  5. 代码区(text段):存放代码,不允许修改,可以执行的

  • const char * arr = "avc"  :“avc”保存在常量区(字面量),这里const表示常量指针,表示这个指针只能进行访问,不能修改指向区域,这里有没有const其实都一样
  • char * arr = "123":字面量保存在常量存储区,arr不能去修改这个区域,但其实arr本来是可以修改指向区域的内容的
  • const char arr[] = "1234":本来是一个字符数组[‘1’,‘2’,‘3’,‘4’,‘\0’]存放在栈区的,但是这里是常量字符数组,可能编译器会优化,将"1234"放在常量区中存储
  • char arr[] = “abc”,普通的局部变量,存放在栈区
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值