内联结构体声明的Sizeof

sizeof an inline struct declaration

本文关键字:Sizeof 声明 结构体 联结      更新时间:2023-10-16

如果有一个结构体,其中声明了一个指向结构体的指针,如何确定子结构体的大小?

typedef struct myStruct {
  int member;
  struct subStruct {
    int a;
    int b;
  } *subStruct_t;
} myStruct_t;

如何为subStruct_t指针分配空间?我在想类似

这样的东西
myStruct_t M;
M.subStruct_t = calloc(1,sizeof(myStruct_t.subStruct_t);

但它显然不起作用。什么好主意吗?

M.subStruct_t = calloc(1,sizeof(*M.subStruct_t));

注意:分配对象是结构体的大小,而不是指针

在C中,内部结构被放置在全局命名空间中,因此您可以简单地使用sizeof(struct subStruct)。在c++中,您必须使用范围解析操作符::,因此您应该改为使用sizeof(myStruct::subStruct)

您也可以直接使用解引用变量的名称——sizeof的操作数不被求值——因此sizeof(*M.subStruct_t)也可以工作。

一个建议:不要用_t后缀来命名你的struct成员。_t后缀应该用于类型,而不是变量/成员。此外,POSIX保留了所有带有_t后缀的标识符(参见POSIX.1-2008规范的2.2.2节),所以你不应该用_t来命名你自己的类型。

如果您使用的是c++,则不应该使用typedef语法,而是更简洁:

struct myStruct_t {
  int member;
  struct subStruct_t {
    int a;
    int b;
  };
  subStruct_t* subStruct;
};

则可以使用:

sizeof(myStruct_t::subStruct_t);

c++中

myStruct_t M;
M.subStruct_t = (myStruct_t::subStruct*)calloc(1,sizeof(myStruct_t::subStruct));

我真的不会将变量或数据成员命名为subStruct_t, _t约定用于类型。

有时很有用的一种技术(例如在将类型作为参数的宏中):

sizeof(*((struct myStruct *)0)->subStruct_t);

我不是100%确定,但我相信这是合法的,因为sizeof的操作数实际上并没有计算。