sizeof内联结构声明

时间:2011-08-09 22:09:20

标签: c++ c memory

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

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);

但它显然不起作用。有什么想法吗?

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:4)

在C中,内部结构放置在全局名称空间中,因此您只需使用sizeof(struct subStruct)即可。在C ++中,您必须使用范围解析运算符::,因此您应该说sizeof(myStruct::subStruct)

您也可以使用取消引用变量的名称 - 不评估sizeof的操作数 - 因此sizeof(*M.subStruct_t)也可以。

一条建议:不要使用_t后缀命名结构成员。 _t后缀应该用于类型,而不是变量/成员。此外,POSIX保留所有带有_t后缀的标识符(请参阅section 2.2.2 of the POSIX.1-2008 spec),因此您不应使用_t为自己的类型命名。

答案 2 :(得分:2)

如果你正在使用c ++,你不应该使用typedef语法,但更干净:

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

  subStruct_t* subStruct;
};

然后你可以通过以下方式获得尺寸:

sizeof(myStruct_t::subStruct_t);

答案 3 :(得分:1)

在C ++中

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

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

答案 4 :(得分:0)

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

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

我不是100%肯定,但我认为这是合法的,因为sizeof的操作数实际上并没有被评估。