结构中的数组成员
当我们学习结构时,对于结构的成员,如果你有观看《C Primer Plus》这本书的话,想必有了解到一个名词——伸缩型数组成员(flexible array member)。
伸缩型数组成员的来源
这是一个来自于C99标准的特性。
伸缩型数组成员的实现
基本规则
伸缩型数组成员必须是结构的最后一个成员
结构中必须至少有一个成员(而这个成员不能是伸缩型数组成员)
伸缩型数组成员的声明类似于普通数组,但方括号内只能为空
具体实现
这借助了工具——malloc&free。malloc函数用于分配内存,free函数用于释放内存,具体我就不多谈了,不然就跑题了(/(ㄒoㄒ)/~~),不了解的朋友们可以自行搜索,都是基础知识啦。
//我直接通过代码来介绍啦
#include <stdio.h>
#include <stdlib.h>//malloc&free函数的原型由这个头文件提供
typedef struct arr
{
int len;
int name[];
}arr;
int main()
{
arr* test = (arr*)malloc(sizeof(arr) + n * sizeof(int));//数组的大小就为n了,n可以是常量也可以是变量
arr* test1;
*test1 = *test;//invalid(无效),这么做无法拷贝伸缩型数组成员,需要使用memcpy函数
//因此不要通过值传递的方式传递这种结构,应该传递结构的地址
//不要把带有伸缩型结构成员的结构作为一个数组的成员或者是另一个结构的成员
free(test);//凡是malloc分配的内存,使用结束后需要free来释放,否则会造成内存泄漏(这个点以后会讲讲哦~)
return 0;
}
内部原理
当使用malloc函数为带有伸缩型数组成员的结构分配内存时,分配给结构的内存是连续的,因此我们可以自己决定为伸缩型数组成员分配多少内存空间。
针对GCC编译器的伸缩型数组成员
这种针对GCC编译器设计的伸缩型数组成员被称之为struct hack。
它与C99标准实现的伸缩型数组成员不同的是
其在结构定义中要将数组长度设定为0
结构中可以只含有这个零长度数组
这种设计方式的好处
如果我们直接使用一个指针来代替伸缩型数组成员,在分配内存时,分配给指针的内存与结构中的其他成员的内存并不一定是连续的。在某些时候,连续的内存分配能方便我们对一些函数的使用,比如read函数和write函数(读者们可以了解了解哦~(●'◡'●))。
以及,直接给一个指针分配了内存,这个指针立马成为了野指针(wild pointer),如果你忘记及时改变它的指向,可能会带来严重的后果。
由于C++语言对C语言的包容性,所以以上要点在C++中也可以实现(⊙v⊙)
今日分享到此结束咯φ(゜▽゜*)♪,如果有疑惑可以私信我或者评论区留言o(* ̄▽ ̄*)ブ