有这样一个结构体:
struct sdshdr {
int len;
int free;
char buf[];
};
而printf ("%d\n", sizeof(struct sdshdr));
的结果是8。如果我将char buf[]
更改为char *
,则结果将为16。为什么在这里char buf[]
不占用空间(sizeof(int)
为4)?何时应该选择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[]
不占用空间(sizeof(int)
为4)?何时应该选择char buf[]
而不是char *buf
?
[]
中的空括号构造可作为struct
的最后一个元素,可以让您为数组的元素分配超出sizeof(sdshdr)
的附加空间,让您将数组数据与数组本身嵌入在一起。free
调用。与[]
方式不同,指针允许您在同一个struct
内有多个可变长度数组,并且元素可以放置在struct
中的任何位置,而不仅仅是在struct
的末尾。free
调用具体是什么样子的例子会是一个非常好的补充。 - tgies更广义地说,使用 "char[]
" :
char[]
实际上会在结构体内分配一定数量的字符。(一个带有 char x[17]
的结构体将增加 17 个字节,依此类推。)char*
只是保存指针。
实际上的 char x[]
(未指定大小 - 我认为对于大小为 0 的情况也是如此) 在结构体末尾是一个特殊情况,称为 "可变数组成员",并在链接的问题和另一个答案中进行了讨论。
sizeof
需要在编译时确定。由于char buf[]
是一个灵活的数组成员,它的大小无法在编译时知道,因此将从计算sizeof
中省略。char *
是指向char变量的指针,其大小已知,因此被包括在内(但这是指针的大小而不是它指向的数组的大小)。