• iOS 阶段学习第九天笔记(内存管理)


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

    实例代码:

     1 #define LEN 10
     2 int main(int argc, const char * argv[]) {
     3     int *p = NULL;
     4     //申请一段空间,放10个int
     5     p = (int*)malloc(10*sizeof(int));
     6     if(p==NULL){
     7         printf("malloc failed
    ");
     8         return 0;//返回,不能进行下面的操作
     9     }
    10     printf("before clear:");
    11     for(int i=0;i<LEN;i++){
    12         printf("%d, ",*(p+i));
    13     }
    14     printf("
     after clear:");
    15     memset(p,0x0,10*sizeof(int));//内存清0
    16     for(int i=0;i<LEN;i++){
    17         printf("%d=0x%x, ",*(p+i),*(p+i));
    18   }
    19   /*数据处理*/
    20     free(p);//手动释放
    21     p = NULL;//增强了保险,使p不可以用
    22     return 0;
    23 }

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

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

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

     参数3:设置多少字节

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

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

    实例代码:

     1  int main()
     2 {
     3     int *p;
     4     p = (int*)calloc(10, sizeof(int));
     5     if(p==NULL){
     6         printf("calloc failed
    ");
     7         return 0;
     8     }
    10     for(int i=0;i<10;i++){
    11         printf("%d ",*(p+i));
    12     }
    13     free(p);
    14     return 0;
    15 }

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

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

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

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

    实例代码:

     1 int main()
     2 {
     3     int *p;
     4     p = (int*)malloc(10*4);
     5     if(p == NULL)  
     6         return 0;
     7     printf("fisrt alloc p=%p
    ",p);
     8     *p = 100;
     9     //清零。。使用
    10     //扩大的内存比较大的时候,p可能会变
    11     p = (int*)realloc(p, 500);
    12     if(p == NULL) 
    13         return 0;
    14     printf("second alloc p=%p
    ",p);
    15     printf("first int is %d
    ",*p);
    16     free(p);
    17     return 0;
    18 }

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

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

     实例代码:

     1 int main()
     2 {
     3     char str[100] = "hello world";
     4     char ch = 'r';
     5     char *p;
     6     p = (char*)memchr(str, ch, 3);//查找范围为前3个字节
     7     if(p == NULL) 
     8         printf("can not find the char.
    ");
     9      else 
    10         printf("%s
    ",p);
    11     return 0;
    12 }

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

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

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

    实例代码:

    1 int main()
    2 {
    3     char str[100] = "hello world";
    4     char str2[20] = "zhongguo";
    5     memcpy(str+strlen(str), str2, strlen(str2)+1);//+1 多拷贝一个结束符
    6     printf("%s
    ",str);
    7 }

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

     实例代码:

    1 int main()
    2 {
    3     char str[100]="1234567890";
    4 //    char *p = "hello";//p指向字符串常量的首地址
    5 //    memmove(str, p, 5);//相当于memcpy
    6     memmove(str, str+2, 5);
    7     printf("%s",str);//34567]67890
    8     return 0;
    9 }

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

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

     实例代码:

     1 int main()
     2 {
     3     char *p1 = "hello world";
     4     char *p2 = "helLo";
     5     int rst = memcmp(p1, p2, 6);
     6     if(rst == 0)
     7             printf("firt 6 chars equal
    ");
     8     else
     9         printf("not equal,%d
    ",rst);
    10     return 0;
    11 }
  • 相关阅读:
    RedisTemplate实现事物问题剖析和解决
    PO BO VO DTO POJO DAO概念及其作用(附转换图)
    Java 应用程序设计规范
    Java web url 规范
    Java 中 Map与JavaBean实体类之间的相互转化
    使用Java 8中的Stream
    [转]http://lua-users.org/wiki/LpegTutorial
    [转]LUA元表
    LPEG
    [转]LUA 学习笔记
  • 原文地址:https://www.cnblogs.com/ChinaKingKong/p/4605265.html
Copyright © 2020-2023  润新知