zoukankan      html  css  js  c++  java
  • C语言第八节 内存管理

    1、内存分类

    内存分区按照内存地址从高到低的顺序可分为:栈区、堆区、静态区(全局区)、常量区、代码区

        1> 栈区:存放所有局部变量,包括函数的形参;

      特点:栈区的内存是由系统自动开辟和回收的,采用先进后出的管理原则管理局部变量,栈区变量只要函数执行完毕,就会被系统回收,所以返回栈区地址是一种非常愚蠢的操作;

        2> 堆区:是系统留给开发使用者的内存,这块内存完全由程序员把控,程序员决定什么时候使用,使用多大,什么时候回收,系统不做任何干预。如果只开辟不回收,那么堆区可用内存就会越来越少,当可用内存为0时,程序员就会崩溃,crash。如果开辟回收之后,又去访问了这块内存空间,也会出现崩溃,叫做野指针。

      So,堆区域的内存我们必须遵守一个原则,有开辟必须有释放,而且释放之后,不允许再去访问;

        3> 静态区,也叫做全局区。主要用来存储静态变量以及全局变量,比如 10、4.5、’a’、“iPhone”

      由系统为变量分配内存空间,程序员不能控制,但是空间的回收只能当程序退出是才会执行。静态区的变量有一个特点,初始化只有一次,而且并不会随着函数的执行完毕被回收。

        4> 常量区:存放系统内部所有的常量;

      我们不会对常量区进行修改或者操作,一旦改了常量区的内存,程序会立即崩溃。常量区中的内容只有一份,并且是只读的。

        5> 代码区:代码区存放的不是源代码,函数都存放在栈区,代码区存放的是源代码编译之后的可执行文件,也可以叫做二进制流文件,或者CPU指令。

     

    2、堆区域的操作函数

        1> malloc,作用是开辟一个给定字节大小的堆区域空间,并且返回该内存空间的首地址, void *malloc(unsigned int size);

        2> calloc,作用是分配n个size⼤⼩的空间,并且把该内存上的所有字节清零。

           void *calloc(unsigned n,unsigned size);

        3> realloc,作用是按给定的地址以及给定的⼤小重新分配。

           void *realloc(void *, unsigned newSize);

        //分配时有两种情况:

          1.如果原有空间地址后面还有足够的空闲空间用来分配,则将先前空间释放,然后以先前地址为开始地址按newSize大小重新分配.

          2.如果原有空间地址后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize⼤小的内存,并把先前内存空间中的数据复制到新的newSize⼤小的空间中,然后将之前空间释放。

        4> free函数,作用是释放内存,内存释放是标记删除, 只会修改当前空间的所属状态,并不会清除空间内容。

        //void *不是空指针,而是泛型指针,根据需求来给定类型;

     

  • 相关阅读:
    判断操作系统
    Oracle之初体验
    判断PDF文件是否相同(通过二进制流判断)
    jQuery基础 html+css3+jquery 点击按钮切换内容
    Jquery基础,点击事件click,鼠标移入事件mouseover。通过事件改变DOM结构
    Jquery教学基础,简单的淡入淡出,隐藏显示,改变CSS等
    Vuex的高级使用及localStorage
    Vuex实现数据共享
    Vue项目代码结构简单介绍
    Vue项目环境准备
  • 原文地址:https://www.cnblogs.com/hyl2012/p/5212796.html
Copyright © 2011-2022 走看看