引言:数组的元素存储于内存中连续的位置上。当一个数组被声明时。它所须要的内存在编译时就被分配。
可是,我们能够使用动态内存分配在执行时为它分配内存。
一块内存的生命周期能够分为四个阶段:分配、初始化、使用、释放。
内存的分配一般使用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将分配还有一块正确大小的内存,并把原先那块内存的内容拷贝到新的块上。