介绍
C语言中的calloc、malloc和realloc函数都是用于动态分配内存的函数。
calloc函数用于一次性分配指定数量和大小的内存块,并将其初始化为零。它的原型为:
void *calloc(size_t nmemb, size_t size);
其中,nmemb表示需要分配的元素个数,size表示每个元素的大小。
malloc函数也用于动态分配内存,但不需要对分配的内存进行初始化。它的原型为:
void *malloc(size_t size);
其中,size表示需要分配的内存大小。
realloc函数则可以重新调整已经分配的内存大小。它的原型为:
void *realloc(void *ptr, size_t size);
其中,ptr是之前分配的内存地址,size表示新的内存大小。
区别
alloc/malloc/realloc有什么不同?
- realloc(NULL,size)等价于malloc(size)
- calloc(num,size)基本上等于void *p=malloc(num* size);memset(p,0,num*size);
需要注意的是,如果使用了calloc函数分配内存,则不能再使用malloc函数对其进行修改;同样地,如果使用了malloc函数分配内存,则不能再使用calloc函数对其进行修改。此外,如果使用了realloc函数重新调整内存大小,则需要确保新旧内存地址之间的连续性,否则可能会导致程序崩溃或者出现未定义的行为。
code 
最后附上代码案例:
#include<stdio.h>
#include<stdlib.h>
#define N 10
int main() {
int* p,* q,*r;
int i;
if (!(p = (int*)malloc(N * sizeof(int))))
{
return -1;
}
for (i = 0; i < N; i++) {
p[i] = 2 + i;
printf("%d ", p[i]);//2 3 4 5 ...11,否则输出随机数
}
puts("");
if(!(q = (int*)calloc(N,sizeof(int))))
{
return -1;
}
for (i = 0; i < N; i++) {
printf("%d ", q[i]);//初始化0
}
puts("");
if (!(r = (int*)realloc(p, 2*N*sizeof(int))))
{
return -1;
}
for (i = 0; i < 2*N; i++) {
printf("%d ", r[i]);
}
puts("");
free(p);//释放分配的内存,防止内存泄漏
p = NULL;
free(q);
q = NULL;
free(r);
r = NULL;
return 0;
}
运行结果如下: