引言:数组的元素存储于内存中连续的位置上。当一个数组被声明时,它所需要的内存在编译时就被分配。但是,我们可以使用动态内存分配在运行时为它分配内存。
一块内存的生命周期可以分为四个阶段:分配、初始化、使用、释放。
内存的分配一般使用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将分配另一块正确大小的内存,并把原先那块内存的内容复制到新的块上。
- 前言
- (四)回调函数
- (一)while(1)死循环与for(;;)死循环的区别
- (二)static关键字
- (三)函数
- (四)可变参数函数
- (五)setjmp和longjmp
- (六)指针
- (七)回调函数
- (八)字符串
- (九)动态内存分配
- (十)结构体
- (十一)深入理解指针
- (十二)命令行参数
- (十三)printf、fprintf、sprintf和snprintf函数
- (十四)const关键字详解
- (十五)字符串输入函数fgets、gets和scanf
- (十六)字符串输出函数puts、fputs和printf
- (十七)字符/字符串输出函数fputc、fputs、putc、putchar和puts
- (十八)字符/字符串输入函数fgetc、fgets、getc、getchar和gets
- (十九)restrict关键词
- (二十)scanf函数详解
- (二一)内联函数
- (二二)位操作
- (二三)errno变量
- (二四)内存分配