C 语言中的结构体和共用体(联合体)(4)

前面介绍,链表结构是动态地分配存储的,即在需要时才开辟一个节点的存储单元。那么,怎样动态地开辟和释放存储单元呢?C 语言编译系统的库函数提供了以下相关函数。

malloc 函数

void * malloc(unsigned size);

其作用是在内存的动态存储区(堆)中分配一个长度为 size 的连续空间,此函数的返回值是一个指向分配域起始地址的指针(类型为 void * ,即空指针类型,使用时可转换为其他指针数据类型)。如果此函数未能成功地执行(例如内存空间不足时),则返回空指针 NULL 。

使用示例:

int *result = malloc(2 * sizeof(int)); struct ListNode *node = malloc(sizeof(struct ListNode));

上述 result 是一个分配在 上的长度为 2 的数组,它与 int result[2]; 的区别是后者分配在内存 区。而 node 是指向一个 struct ListNode 类型的数据(同样已分配在堆上)的起始地址的指针变量。

calloc 函数

void * calloc(unsigned n, unsigned size);

其作用是在内存的动态存储区中分配 n 个长度为 size 的连续空间,函数返回一个指向分配域起始地址的指针,如果分配不成功,返回 NULL 。

realloc 函数

void * realloc(void *p, unsigned size);

其作用是将 p 所指向的已分配的动态内存区域的大小重新改为 size , size 可以比原来分配的空间大或小。该函数返回指向所分配的内存区起始地址的指针,同样,如果分配不成功,返回 NULL 。

如果传入的 p 为 NULL ,则它的效果和 malloc 函数相同,即分配 size 字节的内存空间。

如果传入 size 的值为 0 ,那么 p 指向的内存空间就会被释放,但是由于没有开辟新的内存空间,所以会返回空指针 NULL ,类似于调用 free 函数。

free 函数

void free(void *p);

其作用是释放 p 所指向的内存区,使这部分内存区能被其他变量使用, p 一般为调用上述几个函数返回的值。 free 函数无返回值。

共用体 / union

有时,我们需要使几种不同类型的变量存放到 同一段 内存单元中。例如,可以把一个整型变量(2 个字节)、一个字符型变量(1 个字节)、一个实型变量(4 个字节)放在 同一开始地址 的内存单元中,如下图所示:

C 语言中的结构体和共用体(联合体)

以上 3 个变量在内存中占的字节数不同,但都从同一地址开始存放,也就是几个变量相互覆盖。这种使几个不同的变量共占同一段内存的结构,称为 “共用体” 类型的结构,也称为 “联合体”

共用体变量的定义

定义共用体类型变量的一般形式为:

union 共用体名 { 成员列表 } 变量列表;

例如:

union data { int i; char c; float f; } a, b, c;

也可以将类型声明与变量的定义分开:

union data { int i; char c; float f; }; union data a, b, c;

即先声明一个 union data 类型,再将 a, b, c 定义为 union data 类型。此外,也可以省略共用体名直接定义共用体变量:

union { int i; char c; float f; } a, b, c;

可以看到,“共用体”与“结构体”的定义形式相似,但它们的含义是不同的:

结构体变量所占的内存长度(字节总数)是各成员占的内存长度之和,每个成员都分别独占其自己的内存单元。

共用体变量所占的内存长度等于 最长 的成员的长度。例如上述定义的共用体变量 a, b, c 各占 4 个字节(因为其中最长的实型变量占 4 个字节),而不是各占 2+1+4=7 个字节。

共用体变量的引用

与结构体类似,共用体变量中成员的引用方式为:

共用体变量名.成员名

只有先定义了共用体变量才能引用它,而且不能直接引用共用体变量,只能引用共用体变量中的成员。例如,前面定义了共用体变量 a ,则:

a.i 表示引用共用体变量中的整型变量 i

a.c 表示引用共用体变量中的字符型变量 c

a.f 表示引用共用体变量中的实型变量 f

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/787cb2c1eb540d305fa0626d1c6fe582.html