char arr [0]的含义

时间:2010-08-31 09:47:39

标签: c

  

可能重复:
  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]。它有什么用途?

5 个答案:

答案 0 :(得分:7)

在C中,struct的成员始终按其出现的顺序分配。因此,my_pkt->datapkt对象的“一个接一个”的指针。如果用

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

然后my_pkt->data指向50字节通用缓冲区的开头。

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

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

答案 1 :(得分:0)

当您需要不同大小的结构时,可以使用flexible array member。它简化了额外大小的分配,只需查看链接即可。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

您应该参考此处了解更多详情 - http://bytes.com/topic/c/answers/547407-char-data-0-a

答案 4 :(得分:-1)

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

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

它实际上用零初始化每个内存。所以当你传递一个空指针时,由于空指针导致了段错误。