首页 > 代码库 > 【C语言天天练(九)】动态内存分配

【C语言天天练(九)】动态内存分配

引言:数组的元素存储于内存中连续的位置上。当一个数组被声明时,它所需要的内存在编译时就被分配。但是,我们可以使用动态内存分配在运行时为它分配内存。


一块内存的生命周期可以分为四个阶段:分配、初始化、使用、释放。

内存的分配一般使用C函数库里的malloc函数(原型:void *malloc(size_t size))。关于malloc函数应该注意一下几点:

1、malloc的参数就是需要分配的内存的字节数。

2、malloc所分配的是一块连续的内存。

3、分配成功,则返回指向分配内存起始地址的指针。分配失败,返回NULL指针。

4、对每个malloc返回的指针都进行检查,是好的习惯。

内存的初始化一般要在使用之前手动进行,也可以在分配时由calloc函数一同完成:将分配内存初始化为0。使用就是使用分配所返回的指向内存的指针。

释放内存是为了防止内存泄露,一般使用free函数(原型:void free(void *pointer))完成。它的参数必须是先前从malloc、calloc或realloc返回的值。向free传递一个NULL参数不会产生任何效果。向free传递其他参数会出错。

注意:常见的动态内存错误有以下几种

1、忘记对NULL指针进行解引用操作,即忘记对分配返回的值做判断。

2、对分配的内存进行操作时越过边界。

3、释放并非动态分配的内存,传递给free的必须是一个从malloc、calloc或realloc返回的指针。

4、试图释放一块动态分配的内存的一部分。

5、一块动态内存被释放后被继续使用。

使用动态内存的编程总结:

1、动态内存分配有助于消除程序内部存在的限制。

2、使用sizeof计算数据类型的长度,调高程序的可移植性。


补充:calloc和realloc函数

void *calloc(size_t nmemb, size_t size);

void *realloc(void *ptr, size_t size);

calloc与malloc的区别一是前者返回指向内存的指针之前把它初始化为0.二是calloc的参数包括所需元素的数量和每个元素的字节数。根据这些值,能够计算出总共需要分配的内存。

realloc函数用于修改一个原先已经分配的内存卡的大小。使用该函数,可以使一块内存扩大或缩小。如果原先的内存卡无法改变大小,realloc将分配另一块正确大小的内存,并把原先那块内存的内容复制到新的块上。