再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无符号的
  • //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开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建

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

  3. 动态内存分配存在的问题(内存空洞)------c++程序设计原理与实践(进阶篇)

    new的问题究竟在哪里呢?实际上问题出在new和delete的结合使用上.考察下面程序中内存分配和释放过程: while(1){ Big* p=new big; //...... Small* n1= ...

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

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

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

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

  6. iOS开发多线程篇—单例模式(ARC)

    iOS开发多线程篇—单例模式(ARC) 一.简单说明: 设计模式:多年软件开发,总结出来的一套经验.方法和工具 java中有23种设计模式,在ios中最常用的是单例模式和代理模式. 二.单例模式说明 ...

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

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

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

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

  9. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

随机推荐

  1. Delphi 日志的方法 Log

    写一个日志的函数,只需要传内容进去即可,自动记录时间的,日志保存在'c:\ErpRunLog.txt'下procedure writeWorkLog(sqlstr: string);var filev ...

  2. Delphi TdxBarmanager

    在 Form 上放一个 BarManager鼠标右键它,可以建立一个 MainToolBar,鼠标右键MainToolBar,建什么随便你选.只不过,最后设置一下 BarManager 的 Image ...

  3. 【转】C#读取文件时的共享方式

    string sFileName = @"C:\Exchange.dat";System.IO.StreamReader file = new System.IO.StreamRe ...

  4. [Design Pattern] Filter Pattern 简单案例

    Filter Pattern,即过滤模式,通过不同的过滤标准,或者低耦合将过滤标准组合在一起,对一组对象进行过滤,属于结构类的设计模式. 下面是一个过滤模式的简单案例. Criteria 定义过滤接口 ...

  5. 尚学堂 JAVA DAY11 概念总结

    1.冒泡排序算法 <升序排列> 思路1: 数组长度为n,那么要对数组进行n-1次遍历; step 1---从数组的第一个数开始,两两比较,如果第一个数 > 第二个数,将二者进行交换: ...

  6. webex录屏

    你在寻找好用的录屏软件吗?商用级品质的 WebEx Recorder 就是一款优秀的录屏软件.WebEx Recorder可以录制全屏或指定窗口,可以设定是否包含声音,生成的文件体积极小且极清晰,录制 ...

  7. 在JAVA中 System.getProperty 和 System.setProperty 方法.

    今天着手研究TOMCAT源码. 在刚開始的时候Startup类中init方法中调用非常多次System.getProperty和System.setProperty的方法. 后来经过网上搜索才得知,这 ...

  8. USACO lamps

    IOI 98称号.然后,它似乎没有很困难.即使我能做到这一点微弱的残留物.所有的button按两次不按,高达因此实际上总的等效按4二级,首先C往下<=4,则搜索将能直接照射,总共只有16状态(事 ...

  9. .Net程序猿玩转Android开发---(3)登陆页面布局

    这一节我们来看看登陆页面如何布局.对于刚接触到Android开发的童鞋来说.Android的布局感觉比較棘手.须要结合各种属性进行设置,接下来我们由点入面来 了解安卓中页面如何布局,登陆页面非常eas ...

  10. shell 中条件判断

    if 中的 -z 到 -d 的意思 2011-09-05 10:30 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [  ...