内存的分配与释放(实用解释)malloc,calloc,realloc,free

本文介绍了C语言中用于内存管理的四个关键函数:malloc()用于动态分配内存,calloc()为数组分配初始化为零的内存,realloc()用于调整已分配内存的大小,free()则用于释放不再使用的内存。详细阐述了每个函数的使用方法和注意事项,如malloc()的通用性,calloc()在数组分配中的应用,realloc()在内存不足时的行为,以及free()释放内存的正确方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下列函数的原型在<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,否则程序将报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值