zoukankan      html  css  js  c++  java
  • iOS开发——C篇&动态内存分析

    再C语言中关于内存是一个很重要的知识点,所以今天我就从c语言的内存分配开始为大家解析一下C语言再iOS开发中非常重要的一些知识。

    1:malloc函数的介绍

    C语言中开辟内存空间:malloc函数(堆)

    再C语言中malloc原理大致是这样的:

    • malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用 户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给 用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片 段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检 查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用 malloc动态申请内存块时,一定要进行返回值的判断。

    #include <stdio.h>

    使用malloc需要加入头文件

    #include <stdlib.h>

    • malloc函数的申明是这样的。
    • void *malloc(size_t size);//size_t无符号long型的
    • //void是指范型:可以赋给任何类型的指针变量(第一个字节的地址)

     2:malloc函数的使用及其注意点

     int main(void)

    {

         char *p = malloc(1000);//传参,这里是1000字节(这里将回开在一个叫做堆段的空间,main函数是开辟在栈段的)

         //堆栈是在内存中有一段距离的两端空间

      p[0];//+1是加1个字节得到长度(这里0是指第一个) 

       通过p[x]可以使用他的每一个字节空间

    • 再开辟一个空间,也是1000那么应该和上面是一样的
    • 堆栈是一种先进后出的数据结构
    • int *q = malloc(1000);
    • 使用q我们可以四字节的访问堆空间
    •  空间本身没有类型

        return 0;

    }

     3:关于C语言中内存错误的处理

    #include <stdio.h>

    #include <stdlib.h>

    堆空间开辟的几率可能回失败,返回0表示失败:这个时候我们使用exit(-1);结束当前程序(进程)

    int main(void)

    {

        char *p = malloc(1000);

        if (p == NULL) {//报错并且终止程序

            perror("malloc");

            exit(-1);

        }

        p[0] = 'A'//使用堆空间

        free(p)//这里是释放堆空间,这个空间久可以被其他程序使用,所以这里久变得不安全了。而且必须使用free函数进行释放

        return 0;

    }

     /**

     *注:

     栈空间是静态内存分配,大小编译的时候决定,而且内存空间会自动释放

     堆空间是动态内存分配,大小运行的时候决定,需要手动释放

     */

    堆栈的介绍:

    • 栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
    • 堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表

    另外C语言中还有一些函数需要我们注意的:

    1. realloc(重新分配内存)
    2. calloc(初始化为0)
    3. alloca(在栈上申请内存,自动释放)

    如果你还堆C语言中内存分配不懂或者堆堆栈不理解那么,请认真的看看这张图片,再结合上面的介绍,你就会很清楚了。

  • 相关阅读:
    Deepin Linux下安装安卓应用的各种方式
    win下的终端使用指南
    IDEA自定义TODO
    WSL的ssh-agent问题
    MySQL数据类型
    MySQL常用命令.md
    Period 时间坑
    exp/imp管理
    expdp和impdp管理(逻辑导入导出)
    同义词
  • 原文地址:https://www.cnblogs.com/Alex-Phoenix/p/4654177.html
Copyright © 2011-2022 走看看