和小白一起学数据结构五之m\c\re alloc 内存分配

和小白一起学习数据结构五之动态内存分配

博主昨天报了大概一年的ui设计和广告视觉设计的课程,准备这一年里拿下ui和视觉设计师的证书。所以如果精力跟得上的话应该还会出一些关于ps\ui设计之类的博客。
明天就要开学了,大二上学习课程压力蛮大,备战六级、还在写这个技术博客,呼~感觉一下子事情就多了起来,不过不管是计算机、绘画和设计本身就是自己喜欢的东西,所以准备好痛并快乐着。在座大家一起努力?!

好了下面我们就开始今天的学习内容。(因为博主的爸妈也在跟博主的文章,所以会尽量写得通俗易懂一些,用比喻和生动的例子来跟大家解释计算机技术这样子,谢谢爸妈和大家的支持,鞠躬~)

一、我们为什么使用动态内存分配

设想这样一个场景,一个旅馆有大量有限的客房,在旅游淡季的时候,暴露出我们第一个缺点:清洁阿姨要打扫大量的空房间增大了酒店的维护成本。在旅游旺季的时候,旅馆爆满,此时暴露出我们第二个缺点,当大巴车运送来一车旅客的时候,我们痛苦的发现,没有足够的房间来安排此时一整辆车的旅客,要避免这种情况,我们可以把酒店建的足够大,但此时它的第一个缺点就加速恶化。解决这个方法逻辑很简单,只要在人们脑海中形成“客房永远不会满”这个概念,这就诱使他们不去选择建设有限容量的旅馆(典型例子见离散数学-布达佩斯大饭店)。我们可以将酒店的旅馆当作实际程序操作中的数组,建立一个永远不会溢出的数组非常诱人,即实现动态存储分配,那我们如何来完成这个永不溢出魔法呢?

二、malloc 和 free

关于malloc和free函数的调用和c语言存储其的头文件我已经在昨天博客的末尾给出答案了。现在我们来 变魔法 解释原理。
一个永远不会客满的旅店是什么样的?如何实现?我们通过借用的方法,维护一块居民地,当来客人的时候我们借用当地居民的空房间安排客人,客人离开的时候把房间的使用权还给居民,房间不停的借入和借出此时就很难产生没地方安排一车大巴旅客的问题。
同理,malloc和free函数一同维护一块内存池,当我们需要内存空间时,malloc函数就从系统内存为我们找到合适的空间并返回指针,当我们不需要此块内存时就可以用free函数释放将使用权交由系统。注意malloc函数是调用并返回指针的函数,如果这块内存的初始化非常重要,你要么自己动手对它进行初始化,要么使用calloc函数(下一板块描述)。

malloc函数的参数就是需要分配的字节数,假设我们需要得到分配一个结构需要的字节数,可以参照昨天的博客,上面有一个offsetof函数,其返回值就是一个字节数(size_t)。malloc返回的类型是一个void * 的指针,一般要求你在转换时使用强制类型转换。如果操作系统无法向malloc提供一个合适的内存,它就返回一个null指针,所以在调用前确保函数返回的指针非空是一个非常重要的操作。 null空指针1
free的参数要么时null,要么是之前从malloc、calloc或realloc返回的值。

三、calloc和realloc

calloc和realloc内存分配函数的原型如下:

void *calloc( size_t num_elements,
              size_t  element_size );
void *realloc( void *ptr , size_t  new_size );

calloc和malloc用法相同,都用于内存分配,但calloc在返回之前把它初始化为0. 另一个不同是calloc在请求内存分配时,包括元素的数量,和每个元素的字节数,它计算总的内存分配。

realloc,顾名思义就是重新分配内存块的大小,它并不以任何方式初始化这块新内存。

四、使用动态分配内存

这里有一个例子,它用malloc分配一块内存:

int *pi;
...
pi=malloc( 100);
if (pi==NULL){
        printf("out of memory!\n");
        exit(1);
 }
 ...

如果指针分配成功,我们将具有指向100个字节的指针。因为pi为一个整形指针,所以在整形值为4的机器上,将被当作具有25个整形元素的数组。我们还可以用以下方法声明:
pi=malloc(25* sizeof(int));
既然你有了这块指针,如何使用这块内存呢?如你所见,你既可以使用指针,也可以使用下标:

int *pi2,i;
...
pi2=pi;
for( i=0;i<25;i++)
       *pi2++ =0;
int i;
...
for( i=0;i<25;i+= 1)
       pi[i] =0;

以上,动态分配内容完成,还有一些常见错误整理和实例,我们在以后的实际运用中再来仔细讨论。明天见~


  1. null空指针:NULL符号,定义与stdio.h,实际上的字面值为0. ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值