GNU C中的零长度数组(应用于伙伴系统算法)

在库壳上读了一篇关于Linux内存管理伙伴系统算法实现的文章,coolshell.cn/articles/10427.html,里面有个结构体很让我好奇,

 
 
struct buddy2 {
   unsigned size ;
   unsigned longest [ 1 ];
};(注:在GCC环境下你可以写成longest[0],不占用空间,这里是出于可移植性考虑) 第一次看到长度为零的数组:longest[0],于是搜索了以下,原来这种用法还有个名字:灵活数组成员(fleible array member),ANSI C的标准形式是
struct buddy2 {
   unsigned num ;
   unsigned longest [ ];  //空
}; GNU的形式为
struct buddy2 {
   unsigned size ;
   unsigned longest [ 0 ];  //0长度
}; 当在linux环境下编译0长度的结构时,编译器会顺利通过,但当加上编译选项-pedantic要编译器用ANSI C标准编译时会出现: 警告:ISO C 不允许大小为 0 的数组‘ia’ [-pedantic]
对于如何实现这个变长数组功能,从伙伴系统算法中可窥一二:
self = (struct buddy2*)alloc( 2 * size * sizeof(unsigned));
我们以GNU 0长度形式的机构体分析,若计算sizeof(buddy2),可得结果为4,也就是说0长度数组不占任何空间。上面我们调用alloc分配了2*size个大小的sizeof(unsigned),由于
unsigned num需要分配大小为sizeof(unsigned)的空间,所以还剩余2*size-1个大小的sizeof(unsigned),而这些富余的空间就可以供longest使用了。也就是说,longest最大可以
操纵2*size-1个元素。
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值