在库壳上读了一篇关于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个元素。