malloc和free函数原型如下:
void *malloc(size_t size);
void free(void *pointer);
malloc的参数就是需要分配的内存字节数。如果内存池中的可用内存满足这个需求,malloc就返回一个指向被分配的内存块起始位置的指针。malloc所分配的内存是一块连续的内存。如果不能满足请求,malloc就返回一个NULL指针,因此,对每个从malloc返回的指针都需要进行检查,确保它并非NULL是非常重要的。(动态内存分配常见的错误就是忘记检查所请求的内存是否分配成功)。检查例子:
int *p;
p = (int*)malloc(100);
if(p==NULL){
printf("Out of memory!\n");
exit(1);
}
NULL定义在stdio.h中,实际上是字面值常量0。
free的参数要么是NULL,要么是先前从malloc、calloc、realloc返回的值。向free传递一个NULL不会产生任何效果。传递给free的指针必须是从malloc/calloc/realloc返回的指针,传递给free函数一个指针,让它释放一块非动态分配的内存可能会导致程序立即终止或在晚些时候终止。
calloc和realloc函数原型如下:
void *calloc(size_t num_elements,size_t element_size);
void realloc(void *p,size_t new_size);
calloc与malloc的区别是calloc会将内存初始化为0,这个初始化往往会带来方便。另一个区别是calloc的参数有两个:元素个数以及每个元素所占有的字节数。例如:
int * p=NULL;//要5个int
p=(int *)calloc(SIZE,sizeof(int));
if(NULL==p){
printf("Error in calloc.\n");
return -1;
}
realloc函数用于修改一个原先已经存在(分配)的内存块的大小,使用这个函数,你可以使一块内存扩大或缩小。连续内存块太大时会重新分配并复制原来的内存。看下面例子:
int* a = malloc(sizeof(int)*10);
int* b;
a[0] = 1;
b = realloc(a,sizeof(int)*20);
if(a==NULL){
printf("a out of memory\n");
exit(1);
}
if(b==NULL){
printf("b out of memory\n");
exit(1);
}
printf("%d\n",a);
printf("%d\n",b); //a,b不相等,但总是差120
printf("%d\n",b[0]); //输出1
本文来自C和指针