如果有一个结构带有指向其中声明的结构的指针,那么如何确定子结构的大小?
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);
但它显然不起作用。有什么想法吗?
答案 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
的操作数实际上并没有被评估。