可能重复:
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]。它有什么用途?
答案 0 :(得分:7)
在C中,struct
的成员始终按其出现的顺序分配。因此,my_pkt->data
是pkt
对象的“一个接一个”的指针。如果用
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));
它实际上用零初始化每个内存。所以当你传递一个空指针时,由于空指针导致了段错误。