有关C和指针_动态内存分配的学习记录
扫描二维码
随时随地手机看文章
1.内存分配
void *malloc( size_t size ); void free( void *pointer);
malloc(stdlib.h)的参数是需要分配的内存字节(字符)数。如果内存池的可用内存可用满足这个需求,返回一个指向被分配的连续的内存块的起始位置的指针。如果内存池为空,或者可用内存不足满足要求,操作系统会返回一个一个NULL指针。对于要求边界对齐的机器,malloc返回的内存的起始位置将始终满足对边界对齐要求最严格的类型的要求。
free的参数只能是NULL或malloc、calloc、realloc返回的值。向free传递一个NULL参数不产生任何效果。
2.calloc和realloc
void *calloc( size_t num_elements, size_t element_size ); void *realloc( void *ptr, size_t new_size );
calloc的第一个参数为所需元素的数量,第二个参数为单个元素的字节数,其与malloc的最大区别在于calloc会在返回指向内存块的指针之前将内存块初始为0。
realloc用于修改一个原先已经分配的内存块的大小。如果用于扩大内存块,那么这个内存块原先的内容将保留,新添加的内存添加到原先内存块的后面,新内存不以任何方式初始化;如果用于缩小内存块,该内存块尾部的部分便被拿掉,但剩余的内存块的原先内容将保留;如果原先内存块无法改变大小,realloc将分配另一块正确大小的内存,并将原先内存块的内容复制到新的内存块上。如果第一参数为NULL,则行为与malloc一模一样。
3.常见动态内存错误
注意:
1.对NULL指针进行解引用
2.对分配的内存进行操作时越过边界
3.释放非动态分配的内存
4.试图释放一块动态分配的内存的一部分
5.一块动态内存被释放后继续使用
6.分配内存但使用完毕后不释放(内存泄漏memory leak)
警告:动态内存分配后应检查所请求的内存是否成功分配。