Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174983
  • 博文数量: 42
  • 博客积分: 2618
  • 博客等级: 少校
  • 技术积分: 385
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-26 10:04
文章分类

全部博文(42)

文章存档

2013年(2)

2012年(2)

2011年(3)

2010年(17)

2009年(18)

我的朋友

分类: C/C++

2009-07-26 10:21:26

GNU C中允许使用零长度的数组。它们作为结构体的最后一个元素十分有用,ISO C89中,你需要给目录分配长度1,意味着要浪费空间或者使malloc的参数变得复杂。ISO C99中,你可以使用灵活的数组元素,只是在语法和主义上有微小的差异。
·   灵活的数组元素写为contents[]不带0
·   灵活的数组元素具有不完全的类型,所以sizeof操作也许不能被应用。作为零长度数组的原始实现的奇怪之处,sizeof被赋值为0
 
灵活的数组元素可以作为结构体的最后一个元素出现当其它元素非空时。GCC现在在任何地方允许零长度数组。定义仅含有一个零长度数组的结构体,无论如何,你可能会遇到问题。这样的用法被反对,我们建议仅当灵活数组元素被允许的地方使用零长度数组。
example:
#include
#include

struct arr{

       int a;

       char buff[0];

}

 

int main(int argc,char **argv)

{

       struct arr *ptr;

 

       ptr = (struct att *)malloc(sizeof(struct arr)+4);

 

       if(ptr == NULL){

              printf(“malloc failed\n”);

              reutn -1;

}

memset(ptr,0x30,sizeof(struct arr)+4);

printf("0x%x0x%x0x%x0x%x\n",

ptr->buff[0],ptr->buff[1],ptr->buff[2],ptr->buff[3]);

 

char b[0];

printf(“%d %d %d\n”,sizoef(struct arr),sizoef(int),sizeof(b[0]));

}

 

其中malloc分配了数据结构struct arr的大小再加上4个字节大小,实际上sizoef(struct arr) = 4 = sizoef(int),不包括零长度数组的大小,所以memset之后,buff的内容都是0x30sizeof(b[0]) = 1

阅读(1395) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:<转>IT人不可不听的10个职场故事

给主人留下些什么吧!~~