【问题标题】:Zero-Length Arrays零长度数组
【发布时间】:2012-09-06 21:12:30
【问题描述】:

在 C 中使用零长度数组有什么好处?

例如:

struct email {
    time_t send_date;
    int flags;
    int length;
    char body[];
}list[0];

【问题讨论】:

  • @KeithMiller:这是我的问题。
  • 糟糕,我完全误读了这个问题。我虽然你问过使用零长度数组的disadvantage 是什么。

标签: c arrays


【解决方案1】:

大小为 0 的数组在 C 中无效。

char bla[0];  // invalid C code

来自标准:

(C99, 6.7.5.2p1) "如果表达式是一个常量表达式,它的值应该大于零。"

所以list 声明在您的程序中无效。

具有不完整类型的数组作为结构的最后一个成员是灵活数组成员

struct email {
    time_t send_date;
    int flags;
    int length;
    char body[];
};

这里body是一个灵活的数组成员。

【讨论】:

  • 没错,但大多数编译器都允许你摆脱它,而且通常在灵活数组成员被编码之前完成。是的,人们在使用 struct hack 时应该写 body[1],但并非总是如此。现在这样的代码应该很少见了,所以你可能会在野外遇到它。
  • @dmckee 他们不是只让你把它作为结构的最后一个成员,而不是作为长度为 0 的独立数组吗?
  • @DanielFischer 取决于编译器。有些人只是让它滑动,这样他们就不必对数组进行特殊处理。
  • @DanielFischer:在许多情况下,能够定义一个大小为零的数组并让它表示一个指向下一个结构元素所在位置的指针,这将很有用。除了简单地删除在零长度数组上触发编译器错误的代码之外,许多都不需要典型编译器的任何特殊处理。为什么编译器编写者要竭尽全力禁止可能有用的东西?我可以看到允许构造的唯一缺点是这样的代码:
  • @DanielFischer:struct {unsigned char a; unsigned char NumAsBytes[0]; unsigned int num;} 可能不会完全覆盖NumAsBytes 上的num;为了使其正常工作,必须在 NumAsByte[0] 声明之前添加 int dummy[0] 以强制数组的开头为字对齐。
【解决方案2】:

【讨论】:

  • 没有任何解释的单链接答案通常是不受欢迎的。至少引用所说的答案。
  • 同意。不幸的是,我一周前正在研究同样的问题,无法更好地解释
猜你喜欢
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多