下列函数的原型在<stdlib.h>中。
1.malloc()
原型:
void *malloc(unsigned long);
它只有一个参数,是unsigned long类型,即一个无符号长整数类型。该参数用来指定所分配内存空间的字节数;若分配成功,则返回分配空间的起始地址,否则返回值为NULL。
例如:
指针名=(数据类型 *)malloc(要分配内存空间的大小)
int *p;
p = (int *)malloc(10*sizeof(int));
这段代码的作用是分配一个大小为10个整形大小的空间并返回空间的起始地址给指针p。
注意:malloc()是在内存上分配固定大小的空间,它会在内存上开辟一个大小等同于用户要求的空间然后返回空间的起始地址。
2.calloc()(不常用)
原型:
void *calloc(unsigned long, unsigned long);
它的第一个参数是数组的元素个数,第二个参数是数组元素的字节数。该函数会清除分配内存空间的数据。
例如:
char *pc;
pc = (char *)calloc(n, sizeof(char));
/* 与pc = (char *)malloc(n*sizeof(char));等价 */
上述代码的作用是用于分配n个元素的字符数组空间。
另一个例子,以下语句用于分配n个结构体元素。
struct person *ps;
ps = (struct person*)calloc(n, sizeof(struct person));
/* 与 ps = (struct person*)malloc(n*sizeof(struct person));等价 */
malloc()与calloc()相比,malloc()更具有通用性,而calloc()更适用于为数组分配内存空间。
3.realloc()
原型:
void *realloc(void *, unsigned long);
它的第一个参数必须是先前调用函数malloc()或calloc()得到的内存空间首地址,第二个参数是新的内存空间的字节数。先前申请的存储空间大小不合适,特别是存储空间过小时,可以使用该函数调整申请的内存空间的大小。重新分配的空间中保留了原来空间中的数据。
例如:
指针名=(数据类型 *)realloc(要改变内存大小的指针名,新的内存大小)
int *p;
int x = 5;
p = (int *)malloc(10*sizeof(int));
p = (int *)realloc(p, (10+x)*sizeof(int));
这段代码的作用是将新分配好的大小为10+x个整形大小的空间的起始地址返回给指针p。
新的大小一定要大于原来的大小,不然的话会导致数据丢失!
假如原来的分配后的内存后面还有足够多剩余内存的话,新分配的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址;
假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被释放掉,realloc返回新内存的地址
4.free()
原型:
void free(void *p);
参数p用来指定需要释放的内存空间的起始地址,通常代入malloc()函数返回的地址,释放由p指向的内存空间。
例如:
int *p;
p = (int *)malloc(10*sizeof(int));
...
free(p);
需要注意的是,malloc()函数分配内存空间时,一定要检查函数的返回值,以保证使用指针时,它的值不为NULL,否则程序将报错。