有一个这样的结构:
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 变量的指针,它的大小是已知的,因此被包括在内(但是这是指针的大小而不是它指向的数组)。