动态内存分配

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

举个例子,我们声明一个数组用来存放数值,但是有时候我们不知道要存放多少个,存放的数量根据输入来决定,这个时候我们通常采用的方法是:把数组的长度定义成一个很大的值,这么做有什么缺点呢?


1.因为限定了数组的长度,所以当我们需要的元素个数大于数组所能容纳的元素个数的时候,这种方法就无法无法处理了,同时我们只能加大长度

2.因为加大了长度,当我们只需要容纳少量的元素时候,必然会造成内存的浪费


这个时候我们需要动态地分配内存,根据需求来分配,不溢出不浪费,不多不少刚合适。


如何进行动态内存分配?

c函数库提供了2个函数:malloc()、calloc()、realloc()和free(),前者用来动态分配内存,后者用来释放相应的程序不再使用的内存。这些函数维护着一个内存可供使用的内存池,当程序需要额外的内存时候,使用malloc,malloc就从内存池中选取合适的内存,并像该程序返回指向这块内存的指针。这块内存没有进行初始化。同样,当不再使用这些内存时候,就使用free,释放内存。


malloc 和 free 的原型是什么?

malloc 和free在头文件stdlib.h中声明,原型如下:

void* malloc(size_t size):void * 表示请求的内存用来存储什么类型的数据,c/c++规定可以强制转换成任何类型的指针;size是请求内存的大小,以字节为单位

void *calloc( size_t num_elementa,size_t element_size );在返回指针前,先把内存清空,变成0
void *realloc( void *ptr, size_t new_size );用于加大或者减少已经分配好的内存,如果需要扩大,则在已有的内存后面加上内存块,如果要减少,则把已有的内存块的多余部分块砍掉,注意原先的内存块中的内容都不变;如果原内存块不法改变,则把原来内存块的内容复制到新的内存块中

void  free(void *pointer):参数是指针——要么是空指针;要么是malloc,realloc,calloc中指向内存的指针变量,如果参数是NULL,则free不会产生任何效果

对于malloc,如果内存池中的可用内存满足所请求的内存,则返回给程序一个指向这块内存的首地址的指针,注意这块内存是连续的;如果不满足,返回空指针,检查返回的是不是空指针很重要

if( pi == NULL )
{
printf( "Out of memory!\n" );
exit( 1 );
}

如何书写?

1 
int *p;
p = (int *)malloc(100);


2 
int *p;
p =(int *)malloc(25 * sizeof(int));//2的写法优于1,因为方便移植
free(p);
如何使用已经分配到的内存?

int *p;
p=(int *)malloc(25 * sizeof(int));

第一种方法是使用下标p[0],p[1]……

第二种方式是使用指针 int  * pr = p ;*pr++;


什么是内存泄露(memory leak)?

分配了内存,当不再需要使用这些内存的时候却没有释放它,会造成内存泄露。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

在程序共享内存池的操作系统中,内存泄露会导致可用的内存越来越少,最后程序无法使用内存,只能通过重启来解决这个问题。而在其他操作系统中,操作系统可以记录每个程序使用的内存段,当程序结束时,不再使用的这些的内存段,就会归还给内存池,但是在这样的操作系统中,内存泄露还是一个严重的问题,因为光分配内存却没有返回,迟早会消耗掉内存池可用的内存(???)


注意事项:

检查malloc返回的指针是不是NULL;

不要访问动态内存以外的区域;

free的参数有NULL,malloc,realloc,calloc返回的指针;

用完之后要释放内存;

p=(int *)malloc(25 * sizeof(int))//使用sizeof有利于提高可移植性;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值