• c语言深入学习系列内存管理 CHRIS


    众所周知,C语言程序设计中,内存的分配和管理完全交由程序员来控制,因此,内存管理是每个C程序员必须熟练掌握的。

         一般而言,分配给进程的内存有四个概念上不同的区域,分别为:代码段、数据段、堆和栈,其中数据段又可以细分为初始化为非零的数据和初始化为零的数据。如下图所示:
                -------------------
                |       程序栈         |----------高地址--〉低地址
                -------------------
                |          堆            |----------向上增长
                -------------------
                |          BSS         |----------数据段
                | 全局和静态变量 |
                -----------------------------低地址
                |     可执行代码     |----------代码段
                -------------------
          可执行指令放在代码段中,任何时刻,内存中只有一份相同程序的指令拷贝,多个实例共享这些代码。
          初始化为非零的静态数据和全局数据存放在数据段中,运行相同程序的每个进程,有自己的数据段。
          初始化为零的全局数据和静态分配数据存放在进程的BSS区域中,每个运行的进程都有自己的BSS,程序运行的时候,将数据放到数据段中,由此可知,只有初 始化为非零的变量才占用空间,所以对于类似static int ss[1024];这样的数组自动用0来填充,它占的空间很小。
          堆,动态内存来自于堆,即:通过malloc得到的空间,通常情况下,堆是向上增长的,即:后面分配的地址比前面的地址在数值上大一些。
          栈,分配本地变量的地方,函数参数、函数的返回值和返回地址也放在栈空间中,需要特别注意的是,当函数返回后,存储在栈空间中的函数变量“自动消失”,空间被其他函数使用。栈空间是向下增长的。
          在C语言中,一般通过malloc/calloc函数分配空间,通过free()函数释放空间,使用realloc()改变已分配空间的大小。
          分配内存的步骤:
          1.申明一个指定类型的指针
          2.计算要分配空间的大小,一般使用函数sizeof()来实现
          3.调用函数malloc()完成空间的申请,将函数的返回值赋给指针变量,
          4.检查返回值是否不为NULL,保证空间分配成功
          5.分配好的空间是没有经过初始化的,其中可能包含一些垃圾信息,因此
             调用函数memset()将其用0来填充是个好的习惯
           释放内存步骤:
           1.调用函数free()释放掉空间
           注意:1.不可以使用free()掉后的空间
                    2.free()后,最好将指针置为NULL,因为如果不做这步处理,
                       原来的指针依旧指向刚才释放的空间,可以继续操作
                    3.避免重复释放空间
           在Unix系统上,提供了函数alloca()函数,可以实现在栈空间上分配指定大小的空间,这样的好处是,函数结束后,空间自动释放,不必显式地调用函数free(),但是该函数有很多弊端,比如不可移植等,因此不建议使用。
               有必要提一下malloc、calloc、realloc函数的底层实现,在Linux系统中,提供了brk()和sbrk()函数,上面几个函数就是在这两个函数的基础上实现的。

    原文地址http://hi.baidu.com/guhi/blog/item/d07da76431bbeef1f63654e1.html
  • 相关阅读:
    缓存雪崩与缓存穿透
    读取表中最大值
    使用vscode在谷歌上运行代码
    elment 中tree组件展开所有和收缩所有节点
    深度系统商店提示无法安装软件依赖错误
    诗词,理解,品论
    《45个十分钟读懂资本论》原文、适合朗读版和个人见解
    《论持久战》全文
    OSError: [WinError 126] 找不到指定的模块。
    C++ 获取序列最大(或最小)的 N 个元素
  • 原文地址:https://www.cnblogs.com/chriszsy/p/13216138.html
Copyright © 2020-2023  润新知