首页 文章

malloc和calloc

提问于
浏览
2

我知道这个问题可能被标记为malloc和calloc之间的区别重复,但我还是想问一下 .

我知道calloc启动了内存块,这里我的问题并不是关注那个部分 .

我的问题是

malloc的定义说它分配了一个指定大小的内存块 .

而calloc说它分配了多个内存块,每块内存大小相同 .

这个分配一块内存和多块内存是两者之间真正的区别吗?

因为我觉得我们可以使用malloc做同样的事情 .

例如 :

int *ptr;
ptr=(int *) malloc(100 * (sizeof(int)));

int *ptr;
ptr=(int *) calloc(100,sizeof(int));

最终将分配int所需内存的100倍 .

6 回答

  • 0

    这个已在此网站上提到,但从其他答案来看,我认为值得重复;乘以两个整数可能会导致溢出,如果发生这种情况,

    ptr = malloc(num*size);
    

    可能不会有所需的结果(并且很可能导致后来的分段错误) . 对于这些情况, calloc(num,size) 应该是首选(尽管你也可以在调用malloc之前测试溢出,如果事实 calloc() 将新分配的内存初始化为零困扰你) .

  • 5

    两者之间的主要区别是calloc将内存块初始化为零,而malloc创建的内存块包含垃圾值 .

    所以更适合使用calloc而不是malloc来避免代码中的不确定性 .

  • 7

    那么 calloc 也初始化内存块以包含零,这与 malloc 不同 .

  • 3

    是的,主要区别如上所述 . 从操作系统内存分配的角度来看,calloc()也比malloc()慢 .

    在程序接触malloc()之前,malloc()返回指针不会触及实际内存 . 而calloc()则使用RAM返回内存 .

  • 3

    您的代码示例是正确的... ptr 指向的实际内存大小相同(即100个 int 对象堆上的数组) . 正如其他人所提到的那样,对 calloc 的调用实际上会将该内存清零,因为 malloc 只会给你一个指向该内存的指针,而内存可能也可能没有全部为零 . 例如,如果你获得了从另一个对象中回收的内存,那么对 malloc 的调用仍将具有之前使用的值 . 因此,如果您将内存视为"clean",并且在程序中最终会出现某种类型的意外行为 .

  • 3

    calloc 用ZERO填充内存 .

    p=calloc(n, m);
    

    相当于

    p=malloc(n*m); 
    memset(p, 0, m * n);
    

    因此,如果您打算将分配的内存设置为零,那么使用 malloc ,您必须计算 n*m 两次,或使用临时变量,这就是 calloc 的作用 .

    编辑:我刚刚阅读了ISO C标准,发现无处指定 calloc 的实现应该检查是否 n*m 溢出,即它是否超过C99标准中的常量 SIZE_MAX .

相关问题