iOS学习(C语言)知识点整理

一、内存管理

1)malloc , 用于申请内存; 结构void *malloc(size_t),需要引用头文件<stdlib.h>;在堆里面申请内存,size_t,表示申请空间的大小,单位是字节;如果申请成功,返回这段内存的首地址,申请失败,返回NULL;申请的内存空间需要手动初始化。

注意点:

1、可能会申请失败,所以需要判断返回是否是NULL。

2、申请的内存需要强制转换为指定的数据类型,例如:(int*)malloc(10*sizeof(int))

3、分配的内存是未初始化的,需要先清理后使用。

4、使用完毕需要手动释放,如果没有释放会导致内存泄漏。

5、什么时候用:>500字节(具体大小视公司情况而定),须要手动申请。

6、释放之后的内存不可以再使用,如要使用需要再次申请。

7、如果同时申请两块内存,第一次申请成功,第二次申请失败,一定要记得释放掉第一次成功申请的内存。

实例代码:

 #define LEN 10
int main(int argc, const char * argv[]) {
int *p = NULL;
//申请一段空间,放10个int
p = (int*)malloc(*sizeof(int));
if(p==NULL){
printf("malloc failed\n");
return ;//返回,不能进行下面的操作
}
printf("before clear:");
for(int i=;i<LEN;i++){
printf("%d, ",*(p+i));
}
printf("\n after clear:");
memset(p,0x0,*sizeof(int));//内存清0
for(int i=;i<LEN;i++){
printf("%d=0x%x, ",*(p+i),*(p+i));
}
/*数据处理*/
free(p);//手动释放
p = NULL;//增强了保险,使p不可以用
return ;
}

2)memset, 用于初始化内存空间, 结构 void *memset(void *, int, size_t);需要引用头文件<string.h>

参数1:表示内存的首地址

参数2:内存设置成多少[0,0xff]

参数3:设置多少字节

3)free 用于释放申请的内存,例如:free(p)。

4)calloc 用于申请内存; 不需要手动初始化,申请的内存空间可直接使用。

实例代码:

  int main()
{
int *p;
p = (int*)calloc(, sizeof(int));
if(p==NULL){
printf("calloc failed\n");
return ;
}
for(int i=;i<;i++){
printf("%d ",*(p+i));
}
free(p);
return ;
}

5)realloc ,  重新调整/申请内存;结构void* realloc(void* ptr, unsigned newsize);可以扩大或者缩小。可能执行失败扩大时,

可能分配不到,需要到新的地址申请,那么数据被拷贝到新的位置,原来的内存将被free掉,realloc返回新内存的地址

例如:realloc(NULL, 200) 等价于 malloc(200); 表示新申请一个大小为200的内存;

realloc(ptr,0)等价于 free(ptr);表示释放内存

实例代码:

 int main()
{
int *p;
p = (int*)malloc(*);
if(p == NULL)
return ;
printf("fisrt alloc p=%p\n",p);
*p = ;
//清零。。使用
//扩大的内存比较大的时候,p可能会变
p = (int*)realloc(p, );
if(p == NULL)
return ;
printf("second alloc p=%p\n",p);
printf("first int is %d\n",*p);
free(p);
return ;
}

6)memchr 用于在规定的内存范围中查找指定的字符,void *memchr(const void *src, int c, size_t size);

从s指针指向的内存中查找 c , 找到了返回c在s中的地址,否则返回NULL

实例代码:

 int main()
{
char str[] = "hello world";
char ch = 'r';
char *p;
p = (char*)memchr(str, ch, );//查找范围为前3个字节
if(p == NULL)
printf("can not find the char.\n");
else
printf("%s\n",p);
return ;
}

7)memcpy 用于内存拷贝;void *memcpy(void *dst, const void *src, size_t size);

1、需要保证dst指向的内存空间足够容纳size个字节

2、dst src指向的内存空间不能有重叠部分

实例代码:

 int main()
{
char str[] = "hello world";
char str2[] = "zhongguo";
memcpy(str+strlen(str), str2, strlen(str2)+);//+1 多拷贝一个结束符
printf("%s\n",str);
}

8)memmove 用于内存移动;void *memmove(void *dst, const void *src, size_t len);dst src指向的空间可以重叠

实例代码:

 int main()
{
char str[]="";
// char *p = "hello";//p指向字符串常量的首地址
// memmove(str, p, 5);//相当于memcpy
memmove(str, str+, );
printf("%s",str);//34567]67890
return ;
}

9)memcmp 用于比较字符串大小int memcmp(const void *s1, const void *s2, size_t n);s1==s2  返回0;s1< s2,返回<0 ;

s1>s2,返回>0;返回的值=第一个不相等的字符ascii码差值。

实例代码:

 int main()
{
char *p1 = "hello world";
char *p2 = "helLo";
int rst = memcmp(p1, p2, );
if(rst == )
printf("firt 6 chars equal\n");
else
printf("not equal,%d\n",rst);
return ;
}

iOS 阶段学习第九天笔记(内存管理)的更多相关文章

  1. iOS阶段学习第一天笔记(Mac终端的操作)

    前言部分 原本从事的是.NET开发,一直在要不要转iOS 中犹豫徘徊,经过复杂的内心挣扎终于鼓起勇气辞职脱产学习iOS;希望通过四个月的 学习后能够拿到理想的薪资.以下是学习过程中的学习笔记,为了方便 ...

  2. iOS 阶段学习第八天笔记(指针)

    iOS学习(C语言)知识点整理 一.指针 1)概念:存储变量的地址的一个变量. 2) 数据存储类型分析 1.text (代码段) :存储二进制的可执行代码 2.data(初始化的数据段) 存储初始化的 ...

  3. iOS阶段学习第二天笔记(数据类型与进制)

    iOS学习(C语言)知识点整理笔记 1.C语言32个关键字 一.存储相关 1)auto 声明自动变量 2)register 声明寄存器变量 3)volatile 声明的变量在程序执行过程中可能被隐含的 ...

  4. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  5. 【转】iOS夯实:ARC时代的内存管理

    iOS夯实:ARC时代的内存管理 什么是ARC Automatic Reference Counting (ARC) is a compiler feature that provides autom ...

  6. Objective-C 高级编程:iOS与OS X多线程和内存管理

    <Objective-C 高级编程:iOS与OS X多线程和内存管理> 基本信息 原书名: Pro Multithreading and Memory Management for iOS ...

  7. iOS夯实:ARC时代的内存管理

    iOS夯实:ARC时代的内存管理 文章转自 ARC时代的内存管理 什么是ARC Automatic Reference Counting (ARC) is a compiler feature tha ...

  8. 菜鸟学习Cocos2d-x 3.x——内存管理

    菜鸟学习Cocos2d-x 3.x——内存管理 2014-12-10 分类:Cocos2d-x / 游戏开发 阅读(394) 评论(6)    亘古不变的东西 到现在,内存已经非常便宜,但是也不是可以 ...

  9. Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation

    原文:Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...

随机推荐

  1. 贫下中农版jQuery

    之前写过一篇JavaScript命名空间的文章,写完后一对比对jQuery的简单使用很是惊羡,看了看人家源码,用的原理很类似啊,改进一下之前的版本,做个简易版的jQuery 之前的代码 (functi ...

  2. 实战使用Axure设计App,使用WebStorm开发(4) – 实现页面UI

    系列文章 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求  实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目   实战使 ...

  3. Http基础

    Http基础 这篇文章是讲Android网络请求的先导文章,主要讲Http工作流程,请求报文和响应报文的格式,以及GET和POST方法的具体含义. Http工作流程 HTTP是一个客户端和服务器端请求 ...

  4. ssh文件传输命令:sz与rz命令

    内容概要: rz 上传文件到linux服务器,会出现选择框 sz filename 下载linux文件到windows 一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用s ...

  5. hibernate学习笔记之一 hibernate简介

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架 hibernate可以自动生成SQL语句,自 ...

  6. Atitit  循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate).

    Atitit  循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 1.1. 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称之为循环. ...

  7. Atitit 函数式编程与命令式编程的区别attilax总结  qbf

    Atitit 函数式编程与命令式编程的区别attilax总结  qbf 1.1. 函数式程序就是一个表达式.命令式程序就是一个冯诺依曼机的指令序列. 命令式编程是面向计算机硬件的抽象,有变量(对应着存 ...

  8. paip.为什么使用多线程的原因.

    paip.为什么使用多线程的原因. 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/att ...

  9. [html]三列居中自动伸缩的结构

    html三列居中自动伸缩的结构 <div style="width:100%;height:80px;border:1px solid #DDD;margin-bottom:10px; ...

  10. C++标准库vector类型详解

    Vector简介 vector是定义在C++标准模板库,它是一个多功能.能够操作多种数据结构和算法的模板类(关于模板类我们后面会介绍,如何创建自己的模板类).vector是一个容器,能够像容器一样存放 ...