Chinaunix首页 | 论坛 | 博客
  • 博客访问: 180313
  • 博文数量: 37
  • 博客积分: 1367
  • 博客等级: 中尉
  • 技术积分: 465
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-06 17:41
文章分类

全部博文(37)

文章存档

2015年(1)

2012年(17)

2011年(10)

2010年(1)

2009年(8)

我的朋友

分类: C/C++

2011-12-21 10:36:45

GNU C允许零长度数组,在定义变长对象的头结构时,这个特性很有用。
例如:
struct str_data
{
    int a;
    int data[0];
};

若用sizeof(str_data),那大小为4,即系统没有给data分配空间,int data[0]仅仅意味着程序中通过str_data结构体实例中的data[index]来访问a之后的第index个地址。如下面的例子:
  1. #include <stdio.h>

  2. struct var_data
  3. {
  4.     int i;
  5.     int data[0];
  6. };

  7. int main(void)
  8. {
  9.     int a = 1, b =2;
  10.     
  11.     struct var_data my_var_data[4];
  12.     printf("size of struct var_data:%d\n", sizeof(struct var_data));
  13.     a = 0;
  14.     for (; a < 4; a++)
  15.     {
  16.         my_var_data[a].i = a + 1;
  17.         printf("my_var_data[%d]:%d\n", a, my_var_data[a].i);
  18.     }

  19.     a = 0;
  20. printf("---------------------------\n");
  21. printf("the address of my_var_data[0]:%p\n", &(my_var_data[0]));
  22. printf("the address of my_var_data[0].data[0]:%p\n", &(my_var_data[0].data[0]));
  23.     for (; a < 4; a++)
  24.     {
  25.         printf("my_var_data[%d]:%d\n", a, my_var_data[0].data[a-1]);
  26.     }
  27.    
  28.     return 0;
  29. }
运行后,打印的输出为:
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) |
给主人留下些什么吧!~~