zoukankan      html  css  js  c++  java
  • c语言malloc和calloc使用心得

    在c 中局部变量 静态变量 形参的内存是栈内存 是编译器分配的 而堆内存是用来存储结构 对象等信息

    可以使用指针等操作 指针需要分配足够的内存  使用malloc calloc等方法

    而且返回来的内存是个指针也就是个数组 使用指针 指针就会执行首地址

    比如 c++中使用new 和delete来分配内存

    char* c=new char[100];

     delete c

    realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度

    void* realloc(void* ptr, unsigned newsize);

    malloc用于申请一段新的地址,参数size为需要内存空间的长度,如:

    char* p;
    p=(char*)malloc(20);


    void* malloc(unsigned size);

    callocmalloc相似,参数elsize 为申请地址的单位元素长度,nelem为元素个数,如:
    char* p;
    p=(char*)calloc(20, sizeof(char)); 
    这个例子与上一个效果相同


    void* calloc(size_t nelem, size_t elsize);


    都在stdlib.h函数库内

    情景1:
     char *str="";   

    //到这一句就报错了 因为堆内存不够
     strcpy(str, "Hellooooo");   
     printf("String is %s/n", str); 
     free(str);  

    情景2:

     char *str="";  
     if ((str = (char*)malloc(1)) == NULL)
     {    
      printf("Not enough memory to allocate buffer/n");  
     } 
     strcpy(str, "Hellooooo");   
     printf("String is %s/n", str); 

    //在这里报错 因为空间只有1 Hellooooo占用的空间明显大于1 所以肯定是编译器开启的新空间 所以不是malloc的空间

    //free只能释放malloc 或者calloc创建的空间

    //所以报错
     free(str);

    情景3:

     char *str="";  
     if ((str = (char*)malloc(10)) == NULL)
     {    
      printf("Not enough memory to allocate buffer/n");  
     }  
     str="Hello";   
     printf("String is %s/n", str); 

    //在这里报错 因为=是指向的意思 str 重新指向了一段新的内存 不是malloc出来的

    //free只能释放malloc 或者calloc创建的空间

    //所以报错
     free(str);

    正确的写法

     char *str="";  
     if ((str = (char*)malloc(10)) == NULL)
     {    
      printf("Not enough memory to allocate buffer/n");  
     } 

    //大小为10的内存 不能放10个字符只能放9个 因为c还有个/0 表示结尾
     strcpy(str, "Hellooooo");   
     printf("String is %s/n", str); 
     free(str); 

    当然

    delete 也只能删除new 关键字创建的内存 和malloc 上面的情景是一摸一样的

  • 相关阅读:
    域控制器的常规卸载,Active Directory系列之十三
    理解域信任关系,Active Directory系列之十六
    什么是站点,Active Directory系列之十一
    域控制器的强制卸载,Active Directory系列之十四
    详解操作主机角色,Active Directory系列之九
    【转】MapControl和PageLayoutControl的同步
    AE的一些接口小记
    【转】centos linux 上flv/swf视频服务器架设
    lnmp配置超精简免费flv流媒体服务器笔记
    Flash game 遊戲修改 Cheat Engine 5.4 使用教學
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331523.html
Copyright © 2011-2022 走看看