/*
读书笔记类型多种多样,有摘抄型的,有感想型的,有批注型的,有摘要型的……
现在正在研读《C和指针》,其中有很多我认为必要的知识点,摘抄并简单整理了一下,记录在这里。
*/
43. 动态分配内存函数
void *malloc( size_t size );
malloc所分配的是一块连续的内存。
malloc的参数就是需要分配的内存字节(字符)数,其类型为size_t,定义于stdlib.h之中——
typedef unsigned int size_t;
malloc返回一个指向被分配的内存块起始位置的指针,该指针为void *类型的指针。一个void *类型指针可以转换为其他任何类型指针。对于要求边界对齐的机器,malloc所返回的内存的起始位置,将始终能满足对边界对齐要求最严格的类型的要求。如果没有足够的内存,malloc返回一个NULL指针,因此对每个从malloc返回的指针进行检查,确保它并非NULL是非常重要的。
44. 另一个内存分配函数
void *calloc( size_t num_elements, size_t element_size);
calloc也用于分配内存。malloc和calloc的主要区别是后者返回指向内存的指针之前把内存的值初始化为0;另一个区别是二者参数不同,calloc的参数包括所需元素的数量和每个元素的字节数,calloc可以根据这些值计算出总共需要分配的内存。
45. 再一个内存分配函数
void *realloc( void *ptr, size_t new_size );
realloc函数用于修改一个原先已经分配的内存块的大小。若使原内存扩大,则原内存的内容保持不变,新增加的内存添加到原内存的后面,且新的内存不以任何方法进行初始化;若使原内存缩小,则在原内存尾部部分被拿掉,剩余内存保持不变。如果原内存无法改变大小,realloc将分配另一块正确大小的内存,并把原先那块内存内容复制到新的内存块上。因此,在使用realloc之后,就不能使用指向旧内存的指针,而是应该改用realloc所返回的新指针。如果realloc函数的第1个参数是NULL,那么它的行为就和malloc函数一样了。
46. 释放内存的函数
void free( void *pointer );
free的参数要么是malloc、calloc或realloc返回的值,要么是NULL,如果是NULL,那不会产生任何效果。
47. 如果要获得比如存储25个整数的内存,一个好的技巧是:
int *pi;
pi = malloc( 25 * sizeof( int ) );
这种方法可移植性好一些,即使整数长度不同的机器,也能获得正确的结果。
48. 常见动态内存错误:
①不检查malloc函数(calloc、realloc)返回的指针是否为NULL;
②访问动态分配的内存之外的区域;
③向free函数传递一个并非由malloc函数(calloc、realloc)返回的指针;
④在动态内存被释放之后再访问它。
49. 内存泄漏(memory leak)是指内存被动态分配后,当它不再使用时未被释放。内存泄漏会增加程序的体积,有可能会导致程序或系统崩溃。
用户1776833 2014-10-14 11:00
//deleted