4

有一个这样的结构:

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

4

3 回答 3

4

带有空括号的构造[]允许作为struct. 它允许您为数组元素分配额外sizeof(sdshdr)的空间,让您将数组数据与数组本身一起嵌入。

另一方面,指针将数据存储在单独管理的内存段中,free最后需要额外调用。与这种[]方式不同,指针让您在同一个 . 中拥有多个可变长度数组struct,并且元素可以放置structstruct.

于 2013-03-11T01:38:58.573 回答
1

char[]更一般地取“ ”:

char[]实际上会在结构内分配一些字符。(具有 的结构char x[17]将增长 17 个字节,依此类推。) Achar*将只保存一个指针。

char x[]结构末尾的实际(未指定大小 - 我认为大小为 0 也是如此)是一种称为“灵活数组成员”的特殊情况,并在链接问题和其他答案中进行了讨论。

于 2013-03-11T01:42:34.650 回答
1

还要记住,这sizeof需要在编译时确定。由于char buf[]是一个灵活的数组成员,它的大小在编译时无法知道,因此在计算sizeof.

char *是一个指向 char 变量的指针,它的大小是已知的,因此被包括在内(但是这是指针的大小而不是它指向的数组)。

于 2013-03-11T01:46:25.070 回答