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 *不是空指针,而是泛型指针,根据需求来给定类型;

     

  • 相关阅读:
    ubuntu 制做samba
    《Programming WPF》翻译 第4章 前言
    《Programming WPF》翻译 第4章 3.绑定到数据列表
    《Programming WPF》翻译 第4章 4.数据源
    《Programming WPF》翻译 第5章 6.触发器
    《Programming WPF》翻译 第4章 2.数据绑定
    《Programming WPF》翻译 第4章 1.不使用数据绑定
    《Programming WPF》翻译 第5章 7.控件模板
    《Programming WPF》翻译 第5章 8.我们进行到哪里了?
    《Programming WPF》翻译 第5章 5.数据模板和样式
  • 原文地址:https://www.cnblogs.com/hyl2012/p/5212796.html
Copyright © 2011-2022 走看看