zoukankan      html  css  js  c++  java
  • C语言calloc()函数:分配内存空间并初始化——stm32中的应用

    经常在代码中看到使用malloc来分配,然后memset清零,其实calloc更加方便,一句顶两句~

    头文件:#include <stdlib.h>

    calloc() 函数用来动态地分配内存空间并初始化为 0,其原型为:
        void* calloc (size_t num, size_t size);

    calloc() 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。

    【返回值】分配成功返回指向该内存的地址,失败则返回 NULL。

    如果 size 的值为 0,那么返回值会因标准库实现的不同而不同,可能是 NULL,也可能不是,但返回的指针不应该再次被引用。

    注意:函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。所以在使用 calloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型,例如:

     

    1. char *ptr = (char *)calloc(10, 10); // 分配100个字节的内存空间


    calloc() 与 malloc() 的一个重要区别是:calloc() 在动态分配完内存后,自动初始化该内存空间为零,而 malloc() 不初始化,里边数据是未知的垃圾数据。下面的两种写法是等价的:

     

    1. // calloc() 分配内存空间并初始化

    2. char *str1 = (char *)calloc(10, 2);

    3.  

    4. // malloc() 分配内存空间并用 memset() 初始化

    5. char *str2 = (char *)malloc(20);

    6. memset(str2, 0, 20);


    代码示例:

     

    1. #include <stdio.h>

    2. #include <stdlib.h>

    3.  

    4. int main ()

    5. {

    6. int i,n;

    7. int * pData;

    8.  

    9. printf ("要输入的数字的数目:");

    10. scanf ("%d",&i);

    11.  

    12. pData = (int*) calloc (i,sizeof(int));

    13. if (pData==NULL) exit (1);

    14.  

    15. for (n=0;n<i;n++)

    16. {

    17. printf ("请输入数字 #%d:",n+1);

    18. scanf ("%d",&pData[n]);

    19. }

    20. printf ("你输入的数字为:");

    21. for (n=0;n<i;n++) printf ("%d ",pData[n]);

    22.  

    23. free (pData);

    24. system("pause");

    25. return 0;

    26. }

    运行结果:
    要输入的数字的数目:4
    请输入数字 #1:126
    请输入数字 #2:343
    请输入数字 #3:45
    请输入数字 #4:234
    你输入的数字为:126 343 45 234

    上面的程序会将你输入的数字存储起来,然后输出。因为在程序运行时根据你的需要来动态分配内存,所以每次运行程序你可以输入不同数目的数字。a

  • 相关阅读:
    Cognos无法解密来着内容库的用户名和密码凭证
    JavaScript 中的对象引用
    npm install出现的错误
    箭头函数中this的用法
    [译]ArcGIS Server Map Service Cache的组织结构
    [C#] 如何选择抽象基类与接口
    数据库设计规范
    在DataTable中查询应该注意的问题
    坦克大战总结
    仓库管理系统总结(1)
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007377.html
Copyright © 2011-2022 走看看