有一个这样的结构:
struct sdshdr {
int len;
int free;
char buf[];
};
结果printf ("%d\n", sizeof(struct sdshdr));是 8。如果我改成char buf[],char *结果是 16。为什么char buf[]这里不占空间(是 4)?我应该什么时候sizeof(int)选择呢?char buf[]char *buf
有一个这样的结构:
struct sdshdr {
int len;
int free;
char buf[];
};
结果printf ("%d\n", sizeof(struct sdshdr));是 8。如果我改成char buf[],char *结果是 16。为什么char buf[]这里不占空间(是 4)?我应该什么时候sizeof(int)选择呢?char buf[]char *buf
带有空括号的构造[]允许作为struct. 它允许您为数组元素分配额外sizeof(sdshdr)的空间,让您将数组数据与数组本身一起嵌入。
另一方面,指针将数据存储在单独管理的内存段中,free最后需要额外调用。与这种[]方式不同,指针让您在同一个 . 中拥有多个可变长度数组struct,并且元素可以放置struct在struct.
char[]更一般地取“ ”:
char[]实际上会在结构内分配一些字符。(具有 的结构char x[17]将增长 17 个字节,依此类推。) Achar*将只保存一个指针。
char x[]结构末尾的实际(未指定大小 - 我认为大小为 0 也是如此)是一种称为“灵活数组成员”的特殊情况,并在链接问题和其他答案中进行了讨论。
还要记住,这sizeof需要在编译时确定。由于char buf[]是一个灵活的数组成员,它的大小在编译时无法知道,因此在计算sizeof.
char *是一个指向 char 变量的指针,它的大小是已知的,因此被包括在内(但是这是指针的大小而不是它指向的数组)。