再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语言中内存分配不懂或者堆堆栈不理解那么,请认真的看看这张图片,再结合上面的介绍,你就会很清楚了。

iOS开发——C篇&动态内存分析的更多相关文章

  1. iOS开发——C篇&动态内存分配

    再C语言中关于内存是一个很重要的知识点,所以今天我就从c语言的内存分配开始为大家解析一下C语言再iOS开发中非常重要的一些知识. 1:malloc函数的介绍 C语言中开辟内存空间:malloc函数 再 ...

  2. iOS开发——高级篇——内存分析,Instruments

    一.内存分析 1.静态内存分析(Analyze)不运行程序,直接对代码进行内存分析,查看代码是否有内存泄露优点:分析速度快,并且可以对所有的代码进行内存分析缺点:分析结果不一定准确(没有运行程序,根据 ...

  3. iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建

    iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建 一.实现效果 说明:该示例在storyboard中使用动态单元格来完成. 二.实现 1.项目文件结构 ...

  4. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  5. iOS开发多线程篇—线程安全

    iOS开发多线程篇—线程安全 一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块 ...

  6. iOS开发UI篇—IOS开发中Xcode的一些使用技巧

    iOS开发UI篇—IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文 ...

  7. iOS开发拓展篇—静态库

    iOS开发拓展篇—静态库 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开源库 公开源代码,能看到具体实现 ...

  8. 【转】iOS开发拓展篇—静态库

    原文网址:http://www.cnblogs.com/wendingding/p/3893095.html iOS开发拓展篇-静态库 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码 ...

  9. iOS开发网络篇—XML数据的解析

     iOS开发网络篇—XML数据的解析 iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是 ...

随机推荐

  1. 什么是C#,.NET,ASP.NET?

    C#,.NET,ASP.NET这三个词,对于大家并不陌生,最近花了点时间去了解了下.最终才发现我以前的理解有些偏差.现在分享给大家. 什么是C#?      C#是微软公司发布的一种面向对象的.运行于 ...

  2. C#经典系列-键值对

    1.ToDictionary,ToLookup 从图中我们看到有四个ToXXX的方法,其中ToArray和ToList,用的是非常非常多 我们有这样的一个实体 class student { publ ...

  3. oracle防火墙端口问题

    Oracle服务端口方面会有很多的问题,下面就将为您介绍在防火墙上开放Oracle服务端口的方法,希望对您学习Oracle服务端口方面能有所帮助. 要使Oracle客户端能正常连接到设置有防火墙的安装 ...

  4. iOS APP之本地数据存储(译)

    最近工作中完成了项目的用户信息本地存储,查阅了一些本地存储加密方法等相关资料.期间发现了一个来自印度理工学院(IIT)的信息安全工程师的个人博客,写了大量有关iOS Application secur ...

  5. 解决NoSuchMethodError with Spring MutableValues异常问题

    今天下午项目启动时,遇到一个异常,导致无法启动: [ 221] ERROR - work.web.context.ContextLoader - Context initialization fail ...

  6. 怎样用Google APIs和Google的应用系统进行集成(3)----调用Google 发现(Discovery)API的RESTful服务

    说了这么多,那么首先同意我以Google Discovery RESTful服务为例,给大家演示怎样用最普通的Java代码调用Google Discovery RESTful服务. 引言: 在&quo ...

  7. javascript加载图片获取图片尺寸信息方法

    如果你遇到不方便从服务器取图片尺寸信息的话,用下面代码就很方便了. // 更新: // 05.27: 1.保证回调执行顺序:error > ready > load:2.回调函数this指 ...

  8. yii cgridview 默认的筛选如何做成选择框

    效果图 参照 http://www.yiiframework.com/doc/api/1.1/CGridColumn http://www.yiiframework.com/doc/api/1.1/C ...

  9. webpy:页面下载的三种实现方式

    python: 1.import urllib urlretrieve() 方法直接将远程数据下载到本地. >>> help(urllib.urlretrieve)Help on f ...

  10. C#第一节课

    1,命名规范 A.如果声明一个变量,小写,如果有多个单词,后面首字母大写 如: string sString="aa"; int iNum=20; bool bMale=false ...