iOS 阶段学习第九天笔记(内存管理)
2015-06-28 11:25
441 查看
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、如果同时申请两块内存,第一次申请成功,第二次申请失败,一定要记得释放掉第一次成功申请的内存。
实例代码:
2)memset, 用于初始化内存空间, 结构 void *memset(void *, int, size_t);需要引用头文件<string.h>
参数1:表示内存的首地址
参数2:内存设置成多少[0,0xff]
参数3:设置多少字节
3)free 用于释放申请的内存,例如:free(p)。
4)calloc 用于申请内存; 不需要手动初始化,申请的内存空间可直接使用。
实例代码:
5)realloc , 重新调整/申请内存;结构void* realloc(void* ptr, unsigned newsize);可以扩大或者缩小。可能执行失败扩大时,
可能分配不到,需要到新的地址申请,那么数据被拷贝到新的位置,原来的内存将被free掉,realloc返回新内存的地址
例如:realloc(NULL, 200) 等价于 malloc(200); 表示新申请一个大小为200的内存;
realloc(ptr,0)等价于 free(ptr);表示释放内存
实例代码:
6)memchr 用于在规定的内存范围中查找指定的字符,void *memchr(const void *src, int c, size_t size);
从s指针指向的内存中查找 c , 找到了返回c在s中的地址,否则返回NULL
实例代码:
7)memcpy 用于内存拷贝;void *memcpy(void *dst, const void *src, size_t size);
1、需要保证dst指向的内存空间足够容纳size个字节
2、dst src指向的内存空间不能有重叠部分
实例代码:
8)memmove 用于内存移动;void *memmove(void *dst, const void *src, size_t len);dst src指向的空间可以重叠
实例代码:
9)memcmp 用于比较字符串大小int memcmp(const void *s1, const void *s2, size_t n);s1==s2 返回0;s1< s2,返回<0 ;
s1>s2,返回>0;返回的值=第一个不相等的字符ascii码差值。
实例代码:
一、内存管理
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(10*sizeof(int)); if(p==NULL){ printf("malloc failed\n"); return 0;//返回,不能进行下面的操作 } printf("before clear:"); for(int i=0;i<LEN;i++){ printf("%d, ",*(p+i)); } printf("\n after clear:"); memset(p,0x0,10*sizeof(int));//内存清0 for(int i=0;i<LEN;i++){ printf("%d=0x%x, ",*(p+i),*(p+i)); } /*数据处理*/ free(p);//手动释放 p = NULL;//增强了保险,使p不可以用 return 0; }
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(10, sizeof(int)); if(p==NULL){ printf("calloc failed\n"); return 0; } for(int i=0;i<10;i++){ printf("%d ",*(p+i)); } free(p); return 0; }
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(10*4); if(p == NULL) return 0; printf("fisrt alloc p=%p\n",p); *p = 100; //清零。。使用 //扩大的内存比较大的时候,p可能会变 p = (int*)realloc(p, 500); if(p == NULL) return 0; printf("second alloc p=%p\n",p); printf("first int is %d\n",*p); free(p); return 0; }
6)memchr 用于在规定的内存范围中查找指定的字符,void *memchr(const void *src, int c, size_t size);
从s指针指向的内存中查找 c , 找到了返回c在s中的地址,否则返回NULL
实例代码:
int main() { char str[100] = "hello world"; char ch = 'r'; char *p; p = (char*)memchr(str, ch, 3);//查找范围为前3个字节 if(p == NULL) printf("can not find the char.\n"); else printf("%s\n",p); return 0; }
7)memcpy 用于内存拷贝;void *memcpy(void *dst, const void *src, size_t size);
1、需要保证dst指向的内存空间足够容纳size个字节
2、dst src指向的内存空间不能有重叠部分
实例代码:
int main() { char str[100] = "hello world"; char str2[20] = "zhongguo"; memcpy(str+strlen(str), str2, strlen(str2)+1);//+1 多拷贝一个结束符 printf("%s\n",str); }
8)memmove 用于内存移动;void *memmove(void *dst, const void *src, size_t len);dst src指向的空间可以重叠
实例代码:
int main() { char str[100]="1234567890"; // char *p = "hello";//p指向字符串常量的首地址 // memmove(str, p, 5);//相当于memcpy memmove(str, str+2, 5); printf("%s",str);//34567]67890 return 0; }
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, 6); if(rst == 0) printf("firt 6 chars equal\n"); else printf("not equal,%d\n",rst); return 0; }
相关文章推荐
- iOS 集成环信, 扩展属性, chatcell label 可被点击
- iOS开发学习笔记(二)—— 让图片“动”起来!
- iOS中四种实例变量的范围类型@private@protected@public@package
- iOS block的用法
- 安装nagios框架
- iOS毛玻璃效果的实现
- iOS中系统唯一标识ID
- iOS开发中XML的DOM和SAX解析方法
- iOS加入百度地图的几个问题
- IOS初体验-Tom猫的开发
- 细数iOS上那些你绝对不会注意到的神细节
- iOS编程命名规范说明
- iOS 阶段学习第八天笔记(指针)
- ITMS-SERVICES://方式安装IPA在IOS 7.1中的变化
- iOS开发中如何更快的实现汉字转拼音
- ios 取消键盘响应
- iOS Dyci Xcode 动态注入插件
- ios动画
- iOS 5 ARC完全指南——深入浅出全面讲解ARC
- iOS Xcode运行时上下黑边的解决办法