C语言结构体中的零长数组
实例
struct A
{
int len;
int var[0];
};
struct B
{
int len;
int *var;
}
其中,结构体A使用了零长数组,结构体B用了指针。
为什么要用零长数组
我归纳了以下三点原因:
-
节约空间
在int和指针占4字节的机器上sizeof(A) // 4 sizeof(B) // 8
这是因为A中的var是数组名,B中的var是指针变量,编译器对数组名和指针变量的处理方式不一样。
我们可以把这些变量名看作一个地址(事实上编译器就是这么看的),编译时,编译器从一个变量名和地址的对应表中读取地址。一个变量名代表一个不变的地址常量。
数组名就是一个地址常量。虽然指针名也是一个地址常量,但是指针名对应的地址储存的是一个值,这个值是另一个地址,这后一个地址才是数组真正存储的地方。因为数组直接表示目标地址,而指针间接指向目标地址,所以编译器直接把地址记住就行了,不需要再腾出地方存了。数组名和指针名都是某个地址常量,但是指针存储的地址可变,所以有指针变量。
-
加快速度
上面已经说到数组名和指针的区别了。
现在我们来看看编译器对数组和指针的不同使用方式。
比如数组: int a[10