GNU C允许零长度数组,在定义变长对象的头结构时,这个特性很有用。
例如:
struct str_data
{
int a;
int data[0];
};
若用sizeof(str_data),那大小为4,即系统没有给data分配空间,int data[0]仅仅意味着程序中通过str_data结构体实例中的data[index]来访问a之后的第index个地址。如下面的例子:
- #include <stdio.h>
-
-
struct var_data
-
{
-
int i;
-
int data[0];
-
};
-
-
int main(void)
-
{
-
int a = 1, b =2;
-
-
struct var_data my_var_data[4];
-
printf("size of struct var_data:%d\n", sizeof(struct var_data));
-
a = 0;
-
for (; a < 4; a++)
-
{
-
my_var_data[a].i = a + 1;
-
printf("my_var_data[%d]:%d\n", a, my_var_data[a].i);
-
}
-
-
a = 0;
-
printf("---------------------------\n");
-
printf("the address of my_var_data[0]:%p\n", &(my_var_data[0]));
-
printf("the address of my_var_data[0].data[0]:%p\n", &(my_var_data[0].data[0]));
-
for (; a < 4; a++)
-
{
-
printf("my_var_data[%d]:%d\n", a, my_var_data[0].data[a-1]);
-
}
-
-
return 0;
-
}
运行后,打印的输出为:
size of struct var_data:4
my_var_data[0]:1
my_var_data[1]:2
my_var_data[2]:3
my_var_data[3]:4
---------------------------
the address of my_var_data[0]:0xbf9fe674
the address of my_var_data[0].data[0]:0xbf9fe678
my_var_data[0]:1
my_var_data[1]:2
my_var_data[2]:3
my_var_data[3]:4
可以看到my_var_data[0].data[0]指向了my_var_data[1].a。
阅读(1901) | 评论(0) | 转发(1) |