C中0长度数组的意义是什么?

时间:2011-12-24 16:13:01

标签: c arrays

#include <stdio.h>
int main()
{
    int a[0],b[4][0];
    printf("%d %d ",sizeof(a),sizeof(b));
}
//output
0 0

a[0]的意义是什么,为什么还允许大小为0的2d数组?

3 个答案:

答案 0 :(得分:9)

C和C ++都不允许零长度的数组,所以你的程序格式不正确。

(例如C ++ 11,8.3.4 / 1:“[数组大小]应大于零”。)

(作为一个基本原理:一个零长度的数组将是棘手的,并且混淆与每个对象具有唯一地址的要求相协调。)

正如@sidyll指出的那样,零长度数组在GCC中可用作extension

答案 1 :(得分:3)

您可以在The GCC manual

中找到答案

如果您使用的是c99

  
      
  • 灵活数组成员写为内容[],不带0。
  •   
  • 灵活数组成员的类型不完整,因此可能无法应用sizeof运算符。作为零长度数组原始实现的一个怪癖,sizeof的计算结果为零。
  •   
  • 灵活数组成员可能只显示为非空的结构的最后一个成员。
  •   
  • 包含柔性阵列成员的结构或包含这种结构的联合(可能是递归地),可以不是结构的成员或阵列的元素。 (但是,GCC允许这些用途作为扩展。
  •   

当然,它们如何有用:

  

在GNU C中允许使用零长度数组。它们作为结构的最后一个元素非常有用,它实际上是一个可变长度对象的头:

struct line {
   int length;
   char contents[0];
 };

struct line *thisline = (struct line *)
   malloc (sizeof (struct line) + this_length);
 thisline->length = this_length;

答案 2 :(得分:1)

您的示例中没有太多用途,但零大小数组经常用于最后一个元素是动态调整大小的结构中:

struct {
     int    some_fixed_data [N_FIXED];
     float  more_fixed_size_data [F_FIXED];
     int    n_variable_elements;
     long   variable_elements [0];  // allocated based on item above
} s;

int curlen = sizeof s + sizeof long * s.n_variable_elements;

零长度数组的使用是:

1)variable_elements有一个地址(尽管有人回答)
2)它也有数组语义
3)简化计算数组的动态大小

不幸的是,一些编译器(MSC)会对这样的结构产生混淆,并强制在技术上不正确的重新制定:

struct {
     int    some_fixed_data [N_FIXED];
     float  more_fixed_size_data [F_FIXED];
     int    n_variable_elements;
     long   variable_elements [1];  // allocated based on item above
} s;

int curlen = sizeof s + sizeof long + (s.n_variable_elements - 1);

将零大小数组视为占位符。几乎不需要这样做,除非你被迫使用C,这是许多嵌入式环境中的情况。