1、数组在声明时,它所需要的内存在编译时候就被分配;
数组有其优点与缺点:优点在于是简单,缺点是(1)无法预知长度,数组无法处理程序所需要使用的元素数量超过声明的长度这种情况(2)内存浪费(3)数据溢出
2、C函数库提供两个函数用于执行动态内存分配和释放malloc与free
void *malloc(size_t size);
void free(void *pointer);
注意点:
(1)malloc所分配的是一块连续的内存;
(2)对每个从malloc返回的指针都要进行检查,确保它并非NULL是非常重要的;
(3)向free传递一个NULL参数不会产生任何效果;
(4)对于要求边界对齐的机器,malloc所返回的起始位置将始终能够满足对边界对齐要求最严格的类型的要求;
3、另外两个内存分配函数realloc与calloc
void *calloc(size_t num_elements, size_t element_size);
void realloc(void *ptr, size_t new_size);
malloc与calloc的主要区别是后者在返回指向内存的指针之前把它初始化为0,另外一个小区别在于它们请求内存数量的方式不一样,calloc的参数包括元素的数量和每个元素的字节数;
realloc用于修改一个原先已经分配的内存块的大小,在使用realloc之后,就不能再使用指向旧内存块的指针,而是应该使用realloc返回的新指针,如果realloc的第一个参数是NULL,那么它就跟malloc一样;
4、为了实现代码的可移植性,最好写成如下样子:
p = malloc(sizeof(int) * 100);
5、动态分配内存的常见错误:
(1)对NULL指针进行解引用,即忘记检查所请求的内存是否成功分配;
(2)操作内存时超出了分配内存的边界;
(3)试图释放一块动态分配的内存的一部分,因此传递给free的指针必须是一个从malloc、calloc、realloc函数返回的指针;
(4)一块动态内存被释放后被继续使用;
(5)内存泄漏,因此应保证内存不再使用时,释放内存;