#include <stdlib.h>
#include <stdio.h> // for printf getchar
/*
VS平台不提供以下两个h文件
#include <syslib.h>
#include <alloc.h>
*/
int main()
{
char *p;
system("cls"); // clear screen TC环境中可使用clrscr();而VS平台不提供此接口
//malloc sample
p=(char *)malloc(sizeof(char));
if(p)
printf("malloc success! Memory Allocated at: %x\n",p);
else
printf("malloc failed!\n");
//realloc sample
p=(char *)realloc(p,256);
if(p)
printf("realloc success! Memory Reallocated at: %x\n",p);
else
printf("realloc failed!\n");
free(p);
//calloc sample
p=(char *)calloc(100,sizeof(char));
if(p)
printf("calloc success! Memory Allocated at: %x\n",p);
else
printf("calloc failed!\n");
free(p);
getchar();
return 0;
}
概述
C标准库函数里,与内存分配相关的包含以下四个函数:malloc、realloc、calloc和free。 其中,前三个用于申请内存空间,最后一个用于释放所申请的空间。故为了保证资源使用完毕能正确回收, 无论调用前三者中的哪一个,在函数结束时,都要调用free来释放。
说明
先简单看下前四个函数的原型及功能说明:
malloc
原型:extern void *malloc(unsigned int num_bytes);
功能:分配长度为num_bytes字节的内存块
calloc
原型:extern void *calloc(int num_elems, int elem_size);
功能:为具有num_elems个长度为elem_size元素的数组分配内存
realloc
原型:extern void *realloc(void *mem_address, unsigned int newsize);
功能:改变mem_address所指内存区域的大小为newsize长度。
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
free
原型:extern void free(void *p);
功能:释放指针p所指向的的内存空间。
说明:p所指向的内存空间必须是用calloc,malloc,realloc所分配的内存。 如果p为NULL或指向不存在的内存块则不做任何操作。
区别与联系
区别:
1、malloc和realloc都是用来分配一定长度字节的内存块,而calloc用来分配数组的内存,其大小是num_elems*elem_size
2、malloc、realloc、calloc用来申请内存,free用来释放内存
联系:
1、realloc必须是在调用malloc之后,改变内存长度时使用, calloc则可单独使用
2、无论调用malloc、realloc或calloc,都要在函数结束时调用free,防止内存无法正确释放
代码示例
如上所示, 在VS2010下编译运行通过。
注:
1、调用malloc后的内存地址,与紧接着调用realloc返回的地址可能不同
2、调用malloc后释放, 再调用calloc的返回地址与之前的地址不同
3、调用malloc、realloc后释放,再调用calloc的返回地址与之前的地址可能相同