动态内存分配函数除了常用的malloc函数以外,还有calloc函数和realloc函数,这两个函数的原型如下:
void *__cdecl calloc(size_t _NumOfElements,size_t _SizeOfElements);
void *__cdecl realloc(void *_Memory,size_t _NewSize);
calloc函数用于动态的分配内存,并初将其始化为0。它有两个参数,第一个参数用于设置连续空间的数量,第二个参数用于设置每个空间的大小。所有它分配的总空间字节数为 _NumOfElements * _SizeOfElements。比如 calloc(10,2) 就是分配 10*2 个字节的空间,并将空间初始化为0。
下面通过一段代码演示calloc函数的用法。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
int *pi;
int i,j;
printf("输入需要分配的空间数量:");
scanf("%d",&i);
pi = (int*)calloc(i,sizeof(int));
if(pi == NULL) {
printf("内存分配失败!\n");
exit(1);
}
printf("\r\n内存分配成功:");
for(j=0; j<i; j++) {
pi[j] = j*10;
}
for(j=0; j<i; j++) {
printf("%d ",pi[j]);
}
printf("\r\n\r\n释放内存!\r\n");
free(pi);
return 0;
}
通过代码可以看出,calloc函数的用法和malloc函数基本一样。通过键盘输入需要分配空间的数量,然后使用calloc函数分配内存,每一个内存的大小是 int类型,内存分配完成之后,向内存中写入数据,并将内存中的数据打印出来,使用完内存之后,使用free函数释放刚申请到的内存。
realloc函数用来重新分配内存空间,比如使用malloc函数分配了一片内存空间,在使用的过程总需要调整刚才申请的空间大小,就可以使用realloc函数来重新分配内存空间。
realloc函数有两个参数,第一个参数是已经分配成功的空间地址指针,第二个参数时新空间的大小。新的空间可以比旧空间大,也可以比旧空间小,也可以和旧空间大小一样。
如果第二个参数为0,那么它所指向的空间就会被释放,作用和free函数一样。
如果第二个参数比旧空间的大,那么内存中原来的内容会被保留,新增加的内容添加到原来的内容后面。如果第二个参数比旧空间小,那么原来内存中的尾部就会被截掉,前面的内容依然不变。
当realloc函数成功分配到新的空间后,第一个参数的指针就会被系统回收,此时要操作新空间的话必须使用realloc函数返回的新指针,而不能使用旧指针。新分配的内存地址有可能和旧地址相同,也有可能不同。
在刚才代码的基础上增加realloc函数的使用。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
int *pi,*pj;
int i,j;
printf("输入需要分配的空间数量:");
scanf("%d",&i);
pi = (int*)calloc(i,sizeof(int));
if(pi == NULL) {
printf("内存分配失败!\n");
exit(1);
}
printf("\r\n内存分配成功:");
for(j=0; j<i; j++) {
pi[j] = j*10;
}
for(j=0; j<i; j++) {
printf("%d ",pi[j]);
}
printf("\r\n\r\n输入重新分配内存大小:");
scanf("%d",&i);
pj = (int*)realloc(pi,i);
if(pj == NULL) {
printf("内存分配失败!\n");
exit(1);
}
for(j=0; j<i; j++) {
printf("%d ",pj[j]);
}
printf("\r\n\r\n释放内存!\r\n");
free(pj);
return 0;
}
首先输入需要分配空间的大小,使用calloc函数进行内存分配,然后给分配的内存空间中写入数据并打印出来,这时输入需要重新分配空间的大小,使用realloc函数修改空间大小,然后打印新空间中的内容。
测试结果如下:
首先分配8个空间,将内容打印出来,接着重新修改空间的大小为6,然后打印空间中的数据,可以看到当新空间中的内容和旧空间中的数据一样。
当新分配的空间比旧空间大时,前面空间中的数据和旧空间里面的一样,新增加空间里面的数据是随机的。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://hxydj.blog.csdn.net/article/details/122961792
内容来源于网络,如有侵权,请联系作者删除!