在标准C和C++中“0长数组”如char Array[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的。
但是,GUN中却允许使用,而且,很多时候,应用在了变长结构体中,如:下面看一段C程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _Info
{
int i;
char data[0];
}Info;
int main(int argc, char* argv[])
{
printf("%d/n",sizeof(Info));
return 0;
}
程序的执行结果是:4。整数i就占了4个字节,这表明data没有占用空间。
1. 含义:此处,data是一个数组名,该数组没有元素;该数组的真实地址紧随结构体Info之后;这种声明方法可以巧妙的实现C语言里的数组扩展。
2. 用途 :长度为0的数组的主要用途是为了满足需要变长度的结构体,如缓冲区,数据包等等。
3. 用法 :在一个结构体的最后 ,申明一个长度为0的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量(注意:数组名永远都不会是指针!而且指针占内存空间),但对于这个数组的大小,我们可以进行动态分配,然后用字符串拷贝strcpy()或者内存拷贝memcpy()将开辟的空间拷贝给0长数组data。