再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. 《Ruby语言入门教程v1.0》学习笔记-03

    10.09 第七章 7.1 模块 Ruby标准包里的 Math 模块提供了许多方法,比如:求平方根 sqrt ,使用的时候要这么写:模块名.方法名(参数).如:Math.sqrt( a*5+b ) M ...

  2. 调侃Cookie

    近期看着某些小朋友那琢急的学习心态,瞬间发文一篇,谨此以助小朋友早日有成! 闲话不扯远,实话见真言,晃悠许久觉得开头还是谈谈Cookie这只菜篮,而且是一只私家菜篮,为啥说它是一只菜篮呢,各位看官必定 ...

  3. 弱爆了的Candies

    题目出处 题目描述: n个小朋友坐成一排,每个小朋友有一个数表示他的表现(数字越大表现越好).老师要给每个小朋友发至少1颗糖,相邻的两个小朋友,得分较高的小朋友必须得到更多的糖,问:老师至少需要给出多 ...

  4. python 查看文件夹权限组和用OS模块操作文件夹

    @建议操作server服务器文件夹时可以映射网络驱动盘 import win32securityimport ntsecuritycon as con FILENAME = r'D:\tmp\acc_ ...

  5. MaterialEditText

    https://github.com/rengwuxian/MaterialEditText http://www.rengwuxian.com/post/materialedittext

  6. 实用bootstrap 表格控件

    http://wenzhixin.net.cn/p/bootstrap-table/docs/examples.html

  7. $.each 和$(selector).each()的差别

    Home » jQuery » $.each() $.each() Posted on 2012 年 3 月 15 日 in jQuery, jQuery函数 | by Jason | 译自官方手冊: ...

  8. Configuring the JA-SIG CAS Client --官方

    1. for Java using Spring Configuration of the CAS Client for Java via Spring IoC will depend heavily ...

  9. Apache和Nginx平滑重启

    之前修改了服务器配置都是简单粗暴的用restart重启apache/nginx,据说这样不好.需要平滑重启服务器,避免重启时打断用户行为.然后就根据官方文档了解了一下平滑重启的命令.本文根据Apach ...

  10. OD: Windows Kernel Debug

    内核调试入门 内核程序运行在内核态,因此不能像对用户态应用程序那样来调试.关于内核调试方面的知识请参考<软件调试>这本书.目前内核调试主要有以下三种方法. 一是使用硬件调试器,它通过特定的 ...