动态内存分配

为什么使用动态内存分配?

数据的元素存储于内存中连续的位置上,当一个数组被声明时,它所需要的内存在编译时就被分配,

但是,我们可以使用动态内存分配在运行时为它分配内存。

当我们声明数组时,必须用一个编译时常量指定数组的长度,但是,数组的长度常常在运行时我们知道,

因为它所需要的内存空间取决于输入数据,说到这里,相信你已经明白了,如果内存在编译时就被分配的缺点了。


因此,我们必须熟练使用动态内存分配来解决这个问题:

malloc和free

malloc和free 这两个函数分别用于执行动态内存分配和释放。这些函数维护一个可用内存池,当一个程序需要另外

一些内存时,它就调用malloc函数,malloc函数从内存中提取一块合适的内存,并向程序返回一个指向这块内存的指针。

程序调用free函数把它归还给内存池。

函数原型如下:

void *malloc(size_t size);//malloc的参数就是需要分配的内存字节数

void   free(void *pointer);

注意:如果内存池中的内存可以满足这个需求,那么malloc就返回一个指向被分配的内存块的起始位置的指针。

malloc所分配的是一块连续的内存;

如果内存池的可用内存无法满足这个需求,malloc会向操作系统请求更多的内存,要求得到更多的内存,并在这块新内存上执行分配任务。

如果操作系统也无法向malloc提供更多的内存,那么malloc就返回一个NULL指针

注意:对于每个从malloc返回的指针都要进行检查,确保它非NULL是十分重要的。

calloc和realloc

注意:

(1)calloc也用于内存分配,区别在于calloc在返回值指向内存的指针之前把它初始化为0;

calloc的参数包括所需元素的数量和每个元素的字节数。

(2)realloc函数用于修改一个原先已经分配的内存块的大小,使用这个函数可以使一块内存放大或者缩小

如果realloc函数的第一个参数是NULL,那么它的行为就和malloc一样。

如果原先的内存块无法改变大小,realloc将分配另一块正确大小的内存,并将原先那块内容复制到新的块上,因此,在使用realloc之后,就不能再使用指向就内存的指针,而是应该改用realloc所返回的指针。


常见的动态内存错误:

1.对NULL指针的解引用操作

2.对动态开辟空间的越界访问

3.对非动态内存开辟使用free释放

4.使用free释放一块动态开辟内存的一部分

5.对同一块动态内存多次释放

6.动态开辟内存忘记释放(内存泄漏)


动态内存分配的使用实例:

1.为那些长度在运行时才知道的数组分配内存空间


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值