struct中的char []和char *有什么区别?

时间:2013-03-11 01:33:47

标签: c

有这样的结构:

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[]时?

3 个答案:

答案 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变量的指针,它的大小是已知的,因此包含在内(但是指针的大小不是它指向的数组)。