C Programming: A Modern Approach

第17章 指针的高级用法

2020-03-09  本文已影响0人  橡树人

英文原版:P413

本章主要内容:

17.1节 动态存储分配

C语言的数据结构通常都是大小的固定的,比如当程序被编译后,一个数组的元素个数就是固定的。

考虑在16.3节中的inventory程序,允许用户向数据库中添加零件。数据库是用大小为100的数组存储的。为了增大数据库的容量,我们可以增加数组的大小,重新编译该程序。但是,无论我们使数组变得有多大,总是有可能出现数组被填满。

幸运的是,C语言支持动态存储分配,即在程序执行时分配内存。

使用动态存储分配,我们可以设计按需增长和缩小的数据结构。

虽然动态存储分配可用于所有数据类型,但是动态存储分配被常用于字符串、数组、结构体等。

由于可将动态分配结构体链接起来形成链表、树及其他数据结构,所以我们重点关注动态分配结构体。

17.1.1小节 内存分配函数

为了动态分配存储,我们需要调用在<stdlib.h>中声明的三个内存分配函数之一:

注:

当我们调用某个内存分配函数来请求一块内存时,该函数是不知道我们计划在该内存块里存储的数据类型的,所以内存分配函数不能返回一个指向普通数据类型(比如int或者char)的指针,而是返回一个void *类型的值。

void *类型

17.1.2小节 空指针

当调用内存分配函数时,经常有一种可能:该函数不能分配一块足够大的内存来满足我们的请求。
如果这种情形发生了,则该函数返回一个空指针。

编程提示:

空指针是用宏NULL来表示的,定义在6个头文件里:<locale.h><stddef.h><stdio.h><stdlib.h><time.h>

程序中只要包含任何一个头文件,就能保证编译器可识别NULL
任何使用内存分配函数的程序都会包含头文件<stdlib.h>,当然会使NULL可用的。

例1 测试malloc的返回值是否为NULL

p = malloc(10000);
if (p == NULL) {
  /* 分配失败;应采取的措施*/
}
上一篇 下一篇

猜你喜欢

热点阅读