数组元素存储于内存中连续位置,数组被声明时,其所需内存空间在编译时被分配,但数组长度常在运行时才知道,这时需要使用动态分配内存。
malloc: void *malloc( size_t size )
// 参数size为需分配的内存字节数,返回一个指向被分配内存块起始位置的指针,若分配失败则返回NULL
free: void free( void *pointer )
注:void* 类型指针可转换为其他任何类型的指针
void *calloc( size_t num_elements, size_t element_size )
// 参数分别为元素个数和一个元素所需内存空间的字节数
void *realloc( void *ptr, size_t new_size )
注意对内存分配结果做检查
如果指针不是从早先的malloc、calloc、relloc、realloc返回的,不能做参数传递给free ????应该也可以吧,不过要小心
总结
当数组被声明时,必须在编译时知道他的长度。动态内存分配允许程序为一个长度在运行时才知道的数组分配内存空间。
malloc 和calloc 函数用于动态分配一块内存,并返回一个指向该快内存的指针。malloc的参数就是需要分配的内存的字节数。和他不同的是,calloc 的参数是你需要分配的元素个数和每个元素的长度。calloc 函数在返回前把内存初始化为0,而malloc 函数返回时内存并未以任何方式进行初始化。调用realloc 函数可以改变一块已经动态分配的内存的大小。增加内存块大小时有可能采取的方法是把原来内存块上的所有数据复制到一个新的、更大的内存块上。当一个动态分配的内存块不再使用时,应该调用free 函数把它归还给可用内存池。内存被释放之后便不能再被访问。
如果请求的内存分配失败,malloc、calloc和realloc 函数返回的将是一个NULL 指针。错误地访问分配内存之外的区域所引起的后果类似越界访问一个数组,但这个错误还可能破坏可用内存池,导致程序失败。如果一个指针不是从早先的malloc、calloc 或realloc 函数返回的,它是不能作为参数传递个free 函数的。你也不能只释放一块内存的一部分。
内存泄露是指内存被动态分配以后,当它不再使用时未释放。内存泄露会增加程序的体积,有可能导致程序或系统的崩溃。
使用sizeof 计算数据类型的长度,提高程序的可移植性。