c语言
首先我们来看一道面试题如果你还不能很快就得出答案,那可以通过本次的介绍彻底的了解一下“柔性数组”
参考答案会在文末给出哦!
开发c代码时,经常见到如下类型的结构体定义:
typedef struct list_t{struct list_t *next;struct list_t *prev;char data[0];}list_t;
最后一行char data[0];的作用是()
a、方便管理内存缓冲区
b、减少内存碎片化
c、标识结构体结束
d、没有作用
柔性数组(flexible array)是c99引入的一个新特性这个特性允许你在定义结构体的时候创建一个空数组,而这个数组的大小可以在程序运行的过程中根据你的需求进行更改特别注意的一点是:这个空数组必须声明为结构体的最后一个成员,并且还要求这样的结构体至少包含一个其他类型的成员
上面的简单介绍可能还是没能让你足够了解什么是“柔性数组”,以及具体又该如何使用,下面就通过具体的例子进行解释:
现在我们需要进行学生的一些基本信息的统计,假设我们定义了如下的一个结构体:
可以看到在最后存储“地址(address)“的结构体中,我们申请了一个包含30个字节的数组,如果我们存储的时候只存入较短的地址,以上的定义的是没问题的,但需要存入的地址信息超出了30个字节,程序很可能就崩掉了,就像下面这样
你了解c语言的“柔性数组”吗?看完你就知道了
c语言
这时候具有主角光环的柔性数组就可以登场啦!
我们在结构体中定义一个柔性数组,这样可以确保能够在程序运行过程中“动态”的进行结构体的扩展,是有点动态的感觉了呀!具体代码如下:
运行之后得到结果如下:
从结果输出可以看到,我们成功使用了不同长度的地址,当然程序也不会出现文章开头那样崩溃的情况
此外,虽然我们对结构体进行了如下的初始化
但是却在输出中可以看到结构体的大小并没有因此而发生变化
size of struct:8
st_stu_info结构体的大小是8, 两个int型变量大小刚好为8,也就是说结构体中的数组并没有占用内存,这就是从0开始,却可以拓展的柔性数组
针对柔性数组这一不占用内存的特性,可以构造出内存缓冲区,同时由于是使用多少就申请多少,也起到了减少内存碎片化的作用,所以文章开头的面试题答案是a和b
而对于选项c而言,恰恰相反的是,柔性数组并不是标识结构体结束,而是作为结构体的一种拓展
同时也可以理解为柔性数组为结构体的一个偏移地址,这使得结构体的大小可以进行动态的变化
最后可能还是会有疑问,这和直接使用指针有啥区别呢?像下面这样:
首先柔性数组不占用内存,而指针则不然,此外柔性数组在使用上是直接访问,形式上更加直观,而指针需要经过声明再进行动态分配内存,在效率上和柔性数组相比也稍微低一些,其实在linux内核代码中有较多的柔性数组的使用,感兴趣的可以去深入的了解一下。
你了解c语言的“柔性数组”吗?看完你就知道了
c语言
写在最后:
小伙伴们在学习的过程中难免会遇到很多的困难,有的是初学不知道如何入手,亦或是想要继续提升自己,小编为了帮助大家解决学习问题,大家可以点击上方我的头像私信我发送:“学习”两个字,我将会针对性的帮助解答你学习上的问题和发送你学习资料哦,大家一起进步!
好了,就讲到这里吧,感谢耐心阅读!
无锡到齐齐哈尔物流专线网上商城的建设规划怎样才可以做好大连到福安物流专线兰州到陆丰物流专线企业网站运营过程中需要了解以及注意的几点传统工业型企业以互联网集成创新推动产业生态融通发展网站制作哪家专业,SEO优化中怎么去提高网站的权重和流量?烟台到固原物流专线