在这里找到这个答案: sizeof a struct member
将它完全复制到我的代码中,但是我的编译器对象表明我有一个指向不完整类类型的指针。
uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);
我做错了什么?我想在运行时将clStructCount设置为等于IntelRecsPerPg的值;我认为这是这样做的伎俩。
谢谢!
答案 0 :(得分:3)
在编译器遇到您的sizeof代码时,您的结构定义需要可见。
所以,这个翻译单位应该有效:
struct ALMConfStr {
int IntelRecsPerPg[MagicNumber];
};
// ...
uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);
它是否全部在一个文件中,或者结构位于#include
代码之前的标题sizeof
d中。
但是,这个:
struct ALMConfStr;
// ...
uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);
不起作用,因为编译器不知道 struct ALMConfStr
包含的内容,或IntelRecsPerPg
在该上下文中的内容。
答案 1 :(得分:0)
我认为没有struct ALMConfStr
或IntelRecsPerPg
不是struct ALMConfStr
说
struct ALMConfStr{
//some member variables
data_type IntelRecsPerPg;
//some more member variables
};
基本上sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg)
试图获得
sizeof(IntelRecsPerPg)
在结构中假设结构在地址0处可用。
答案 2 :(得分:0)
来自对Useless的评论'回答:
来自我的标题文件:
typedef struct ALMConfStruct {
uint8_t updateMode;
uint8_t flashPgSize;
uint8_t flashMaxPagesSize;
uint8_t IntelRecsPerPg;
fptr_t appResetAddr;
uint16_t appEndAddr;
uint8_t comIntf;
}ALMConfStr;
您的struct
代码为ALMConfStruct
而不是ALMConfStr
,所以
struct ALMConfStr
声明一个新的不完整的struct
类型。移除struct
,或使用代码中的struct ALMConfStruct
来确定尺寸。
uint8_t clStructCount = sizeof(((ALMConfStr *) 0)->IntelRecsPerPg);
或
uint8_t clStructCount = sizeof(((struct ALMConfStruct *) 0)->IntelRecsPerPg);