C语言结构体中的零长数组

C语言除了在大学的时候了解过,以及学习APUE的时候有用过外,工作之后基本没有看过C语言相关的东西。近日在了解Redis,又因为其源码只用了C语言,而且代码体量不算很大,所以想通过了解源码来学习一下。

在开始了解Redis中最简单的结构sds时,直接懵逼了。为什么懵逼后面再说,先简单介绍一下sds,sds中的sdshdr结构是Redis自己实现的字符串的结构,是整个Redis中最基本的数据结构,先来看一下其结构是怎么样的。

1.为什么结构体中的数组可以不指定长度??

2.通过zmalloc中的sizeof可以看出其sdshdr结构中的buf这个字段居然没有占空间??

3.为什么不用指针代替buf??

在Google过程中找了好多文章,都没有解释的很仔细,直到看到了耗子叔的这篇文章,C语言结构体里的成员数组和指针,解释的很详细,包括结构体中的数组和指针的区别等等。

总结一下:

1.0长度的数组在ISO C和C++的规格说明书中是不允许的,但是GNU C是支持的。

2.零长度的数组是存在于结构体内的,但是不占结构体的size。

3.结构体中用0长数组是为了给一个结构体内的数据分配一个连续的内存,这样既方便内存释放,也有利于访问速度。(所有Redis中申请的字符串都是这样的结构,在兼容char*的存储方式上,可以很快的取到字符串长度和这个字符串剩余的空间)

4.归根到底,数组的原地就是内容,而指针的那里保存的是内容的地址。

发表评论

电子邮件地址不会被公开。 必填项已用*标注