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