分配内存malloc()、calloc()和free()


malloc()

函数原型为void *malloc(unsigned int size);

malloc()函数接受一个参数:所需的内存字节数。malloc()函数会找到合适的空闲内存块,这样的内存是匿名的。也就是说,malloc()分配内存,但是不会为其赋名。然而,它确实返回动态分配内存块的首字节地址。因此,可以把该地址赋给一个指针变量,并使用指针访问这块内存。
从ANSI C标准开始,C使用一个新的类型:指向void的指针。该类型相当于一个“通用指针”。malloc()函数可用于返回指向数组的指针、指向结构的指针等,所以通常该函数返回值会被强制转换为匹配的类型。在ANSI C中,应该坚持使用强制类型转换,提高代码的可读性。然而,把指向void的指针赋给任意类型的指针完全不用考虑类型匹配的问题。
如果malloc()分配内存失败,将返回空指针。

double * ptd;
ptd = (double*) malloc(30 * sizeof(double));

在C中,不一定要使用强制类型转换(double *),但是在C++中必须使用。


以上代码为30个double类型的值请求内存空间,并设置ptd指向该位置。让ptd指向这个块的首元素,便可像使用数组名一样使用它。也就是说,可以使用表达式ptd[0]访问该块的首元素,ptd[1]访问第二个元素。
通常,malloc()要与free()配套使用。free()函数的参数是之前malloc()返回的地址,该函数释放之前malloc()分配的内存。

free()的重要性

void free(void *ptr);

静态内存的数量在编译时是固定的,在程序运行期间也不会改变。自动变量使用的内存数量在程序执行期间自动增加或减少。但是动态分配的内存数量只会增加,除非用free()进行释放。(一些操作系统在程序结束时会自动释放动态分配的内存,但是有些系统不会。)


如果耗尽了所有的内存,这类问题称为**内存泄漏**(memory leak)。调用free()函数可避免这类问题的发生。

calloc()

函数原型:void* calloc(unsigned int num,unsigned int size);

long * newmem;
newmem = (long *)calloc(100, sizeof(long));

calloc()函数接受两个无符号整数作为参数(ANSI 规定是size_t类型)。第一个参数是所需的存储单元数量,第二个是存储单元的大小(以字节为单位)。
calloc()函数还有一个特性:他把块中的所有位都设置为0(注意,在某些硬件系统中,不是把所有位都设置为0来表示浮点值0)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值