内存分区-学习笔记

  1. 内存分区
    1. 运行前
      1. 代码区
        1. 共享的
        2. 只读的
      2. 数据区
        1. data 已初始化的全局变量、静态变量、常量
        2. bss  未初始化的全局变量、静态变量、常量
    2. 运行后
      1. 栈区
        1. 属于先进后出的数据结构
        2. 由编译器管理数据开辟和释放
        3. 变量的生命周期在该函数结束后自动释放掉
      2. 堆区
        1. 容量远远大于栈
        2. 没有先进后出这样的数据结构
        3. 由程序员管理开辟和管理释放
          1. malloc、free
        4. 记住手动开辟的要手动释放
  2. 栈区
    1. 不要返回局部变量的地址,因为局部变量在函数执行之后就释放了,我们没有权限取操作释放后的内存
  3. 堆区
    1. 在堆区开辟的数据,记得手动开辟,手动释放
    2. 注意事项
      1. 如果在主调函数中没有给指针分配内存,那么被调函数中需要利用高级指针给主调函数中指针分配内存ps:采用二级指针的方式&p=**p,传入给被调函数使用,在被调函数中使用**p返回的是*p的地址。
  4. 数据区
    1. 放入是静态变量、全局变量、常量
    2. static 和 extern 区别
      1. static 静态变量:编译阶段分配内存,只能在当前文件内使用,只初始化一次
      2. extern 全局变量,C语言下默认的全局变量前都隐藏的加了该关键字。可以通过这个应用外部的变量。

                      ps:ectern属于外部链接,当链接发生错误发出“无法解析外部命令”的错误

  1. const修饰的变量
    1. 全局变量
      1. 直接修改 失败
      2. 间接修改 失败  原因放在常量区,受到保护
    2. 局部变量
      1. 直接修改 失败
      2. 间接修改 成功  原因放在栈上
      3. 伪常量 不可以初始化数组
  2. 字符串常量
    1. 不同的编译器可能有不同的处理方式
    2. ANSI没有指定出标准
    3. 有些编译器可以修改字符串常量,有些不可以
    4. 有些编译器将相同的字符串常量看成同一个
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值