【问题标题】:Meaning of char arr[0] [duplicate]char arr[0] 的含义 [重复]
【发布时间】:2010-08-31 09:47:39
【问题描述】:

可能重复:
Array of zero length

我见过这样的代码:-

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct pkt {
  int pk_type;
  int tag;
  int magic_num;
  char data[0];  <-------- what does this mean ???
}__attribute__((packed));

typedef struct pkt p_t;
int main(void)
{
  p_t *p = (p_t *)calloc(1, sizeof(p_t));
  if(!p) {
    perror("p");
    return -1;
  }
  p->pk_type = 1;
  p->tag = 0xb00bbabe;
  p->magic_num = 0xcafebabe;
  strcpy("hello world", p->data); <-- Seg faults here !!!  

  return 0;

}

我想知道 arr[0] 的含义。我的意思是在什么情况下我们需要使用 arr[0]。它有什么用途?

【问题讨论】:

  • 即使数组被定义为足够大,这也会出现段错误 - 您正在从 p-&gt;data 复制到字符串文字。
  • 请注意:C++ 不允许静态的零长度数组。
  • @DeadMG:C 和 C++ 都不允许在任何地方使用零长度数组。零长度数组声明总是明确非法的。
  • @Andrey..此 URL 讨论零边距数组 gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/…
  • @Anil Vishnoi:你希望我在那个 URL 上找到什么?

标签: c


【解决方案1】:

在 C 中,struct 的成员总是按照它们出现的顺序分配。所以,my_pkt-&gt;datapkt 对象的“一个过去”的指针。如果用

初始化
my_pkt = malloc( sizeof( struct pkt ) + 50 );

然后my_pkt-&gt;data 指向一个 50 字节的通用缓冲区的开头。

只允许以这种方式定义结构的最后一个成员。

为了更符合 C99,省略 0 并写成 char data[];

【讨论】:

  • 不一定是“一个结束”——可能有结构填充。
  • 首先,零大小的数组声明在所有版本的 C 语言中都是非法的。其次,my_pkt-&gt;data 并不是真正的指针。
  • @AndreyT:你有关于零大小数组非法(可能是违反约束)的参考吗?大小恰好为零的 VLA 呢?我在 n1256 中找不到任何东西。
  • @Philip Potter:VLA 的大小确实可以为零。我在谈论编译时大小的声明。要求在 C99 的 6.7.5.2/5 中给出:“......它应具有大于零的值”。 C89/90 的 6.5.4.2 中存在相同的要求:“...应是一个值大于零的整数常量表达式”。
  • @AndreyT:实际上,6.7.5.2/5 讨论了非整数常量表达式,因此 VLA 的大小也必须 >0。 (我现在看到 6.7.5.2/1 对非 VLA 数组大小设置了限制 >0)。
【解决方案2】:

这是一个flexible array member,可以在您需要不同大小的结构时使用。它简化了额外大小的分配,请看链接。

【讨论】:

    【解决方案3】:

    这就是GCC Manual 关于零长度数组的说法

    【讨论】:

      【解决方案4】:

      这是一个零字节数组。用于在运行时附加任意大小的数据。在通过套接字发送数据时非常有用。

      你应该参考这个了解更多细节-http://bytes.com/topic/c/answers/547407-char-data-0-a

      【讨论】:

        【解决方案5】:

        char arr[0] 与 char * 相同。你得到分段错误的原因是,因为当你在下面的代码行中执行 calloc 时

        p_t *p = (p_t *)calloc(1, sizeof(p_t));
        

        它实际上用零初始化每个内存。所以当你传递一个空指针时,它会因为空指针而导致分段错误。

        【讨论】:

        • 数组(即使大小为零)不是指针。所以,不,它甚至与char * 完全不同。
        猜你喜欢
        • 2020-09-29
        • 2013-05-16
        • 2017-05-02
        • 1970-01-01
        • 2011-04-27
        • 2010-11-18
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        相关资源
        最近更新 更多