第十一章 动态内存分配
1.动态内存分配的优点是简单。但是缺点有好几个。首先,这种声明在程序中引入了人为的限制,如果程序需要使用的元素超过了声明的长度,则无法处理这种情况。要避免这种情况,显而易见的方法是把数组声明的更大一些,但这种做法使它的第2个缺点进一步恶化。如果程序实际需要的元素数量比较少时,矩形数组的绝大部分内存空间都被浪费了。第3个缺点是如果输入的数据超过了数组的容纳范围时,程序必须以一种合理的方式做出响应,他不应该由于一个异常而失败,但也不应该打印出看上去正确实际上确实错误的结果。
2.对每个从malloc返回的指针都进行检查,确保它并非NULL是非常重要的。
3.void* calloc(size_tnum_elements,size_t element_size)
参数包括所需元素的数量和每个元素的字节数。返回指向内存的指针之前把它初始化为0。
4.void realloc(void*ptr,size_t new_size)
如果原先的内存块无法改变大小,realloc将分配另一块正确的大小内存,并把原先那块内存的内容复制到新的块上。因此在使用realloc之后,就不能使用指向旧内存的指针,而是应该改用realloc所返回的新指针。
如果它的第一个参数是NULL,那么它的行为就和malloc一模一样。
5.常见的动态内存错误,包括对NULL指针进行解引用操作、对分配的内存进行操作时越过边界、释放并非动态分配的内存、试图释放一块动态分配的内存的一部分以及一部分内存被释放之后被继续使用。
6.分配内存使用后不手动释放会造成内存泄漏。
第十二章 使用结构和指针
1.链表就是一些包含数据的独立数据结构的集合。
2.在链表中,每个节点包含一个链表下一个节点的指针,链表最后一个指针字段的值NULL
3.为了记住链表的起始位置,可以使用头结点来指向第一个结点。
4.事实上链表的节点可以存储在内存的各个地方。
5.不要仅仅以代码的大小衡量代码的效率。