C语言复习之动态内存分配

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

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

3.为什么使用动态内存分配

1>当使用数组时,必须用一个常量来指定数组的长度。但是,有时候,数组的长度常常在运行时才知道。因此,在某些情况下,我们通常采取声明一个较大的数组,它可以容纳可能出现的最多元素。

2>该方法的优点是:简单。

3>它的缺点是:

Ø  这种声明在程序中引入了人为的限制,如果程序需要使用的元素数量超过了声明的长度,它就无法处理这种情况。要避免这种情况,最简单的方法就是把数组声明的更大一些。

Ø  如果程序实际需要的元素数量比较少时,巨型数组的绝大部分内存空间都被浪费了。

Ø  如果输入的数据超过了数组的容纳范围时,程序必须以一种合理的方式作出响应。

一.malloc和free
1.c函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放。这些函数维护一个可用内存。

2.当一个程序另外需要一些内存时,它就调用malloc函数,malloc从内存池中提取一块合适的内存。并向该程序返回一个指向这块内存的指针。这块内存此时并没有以任何方式进行初始化。如果要对其进行初始化,要么自己动手进行初始化,要么使用calloc()函数。当一块以前分配的内存不在使用时,程序调用free函数把它归还给内存池供以后使用。

3.这两个函数的原型如下,都在头文件stdlib.h中声明

1>void *malloc(size_t  size);

2>void   free(void  *pointer)

4.malloc的参数就是需要分配的内存字节数。如果内存池中的可用内存可以满足这个需求,malloc就返回一个指向被分配的内存块起始位置的指针。

1>malloc所分配的是一块连续的内存。例如:如果请求分配100个字节的内存,那么它实际分配的内存就是100个连续的字节,并不会分开位于两块或多块不同的内存。同时,malloc实际分配的内存有可能比你请求的稍微多一点。但是这时由编译器定义的。

2>如果内存池是空的,或者它的可用内存无法满足要求时。在该情况下,malloc()函数向操作系统请求,要求得到更多地内存,并在这块内存上执行分配任务。如果操作系统无法向malloc提供更多的内存,malloc就返回一个NULL指针。因此,要对每个从malloc返回的指针都进行检查,确保它并非NULL是非常重要的。

5.free的参数必须要么是NULL,要么是一个先前从malloc,calloc或realloc返回的数值。想free传递一个NULL参数不会产生任何效果。

6.malloc并不知道请求的内存需要存储的是整型、浮点值、结构还是数组。Malloc返回一个类型为void *的指针。在标准中表示一个void *类型的指针可以转换为其他任何类型的指针。因此,在使用前,要进行强制类型转换。