结构体中的char []和char *有什么区别?

4

有这样一个结构体:

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


可能是在C中使用柔性数组成员是否不好?的重复问题。 - Oliver Charlesworth
3个回答

4
[]中的空括号构造可作为struct的最后一个元素,可以让您为数组的元素分配超出sizeof(sdshdr)的附加空间,让您将数组数据与数组本身嵌入在一起。
另一方面,指针将数据存储在单独管理的内存段中,并需要在结尾处进行额外的free调用。与[]方式不同,指针允许您在同一个struct内有多个可变长度数组,并且元素可以放置在struct中的任何位置,而不仅仅是在struct的末尾。

在这个答案中,增加一个关于最后那个额外的 free 调用具体是什么样子的例子会是一个非常好的补充。 - tgies

1

更广义地说,使用 "char[]" :

char[] 实际上会在结构体内分配一定数量的字符。(一个带有 char x[17] 的结构体将增加 17 个字节,依此类推。)char* 只是保存指针。

实际上的 char x[] (未指定大小 - 我认为对于大小为 0 的情况也是如此) 在结构体末尾是一个特殊情况,称为 "可变数组成员",并在链接的问题和另一个答案中进行了讨论。


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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接