内联结构体声明的Sizeof
sizeof an inline struct declaration
如果有一个结构体,其中声明了一个指向结构体的指针,如何确定子结构体的大小?
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
的操作数实际上并没有计算。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- 只有当声明一个对象时,内存空间才会分配给类的数据成员,那么为什么 Sizeof(class_name) 给我结果
- 内联结构体声明的Sizeof