第十一章 动态内存分配
数组在声明的时候,本身作为一个指针常量,它在编译时候内存就已经被分配好了。但是有时候程序不知道这个数组到底有多长,所以,为了防止内存的浪费,C提供了动态内存分配的策略。
其实,作为独立的一章,本章显得内容不多。malloc,free,calloc,realloc就没有了,但是它包含很多用法,也有很多陷阱。
总结:
malloc和calloc函数都用于动态分配一块内存,并返回一个指向该块内存的指针。malloc返回的是一个 void *的指针。
malloc的参数就是需要分配的内存的字节数。calloc的参数是个数*单位长度。
realloc函数可以改变一块已经动态分配内存的大小。
void *malloc(size_t size); 或者 void *malloc((num) * sizeof(...))
void free(void *pointer);
void *calloc(size_t num_elements, size_t element_size);
void realloc(void *ptr, size_t new_size);
如果realloc的第一个参数是ptr == NULL,那么它的返回值和malloc一模一样,一个NULL的指针。
当一块内存不再使用时,应该调用free函数归还给内存池。但是如果不是malloc、calloc或者realloc函数返回的,它是不能作为参数传递给free。
内存泄露是指内存被动态分配以后,它不再使用时未被释放。内存泄露会增加程序的体积。
警告:
1、不检查从malloc函数返回的指针是否为NULL。
#include <stdlib.h>
#include <stdio.h>
array = malloc(10 * sizeof( int ));
if(array == NULL)
exit (EXIT_FAILURE);
2、访问动态分配的内存之外的区域。
3、向free函数传递一个并非由malloc函数返回的指针。
根本不会有作用。
4、在动态内存被释放之后再访问它。
编程提示:
1、动态内存分配有助于消除程序内部存在的限制。
2、使用sizeof计算数据类型的长度,提高程序的可移植性。
当32位机、16位机时候,int是不同字节数的。因此最好sizeof(int)。