0

在这里找到了这个答案: sizeof a struct member

将它完全复制到我的代码中,但我的编译器对象有一个指向不完整类类型的指针。

uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);

我究竟做错了什么?我想在运行时将 clStructCount 设置为等于 IntelRecsPerPg 的值;我认为这是这样做的诀窍。

谢谢!

4

3 回答 3

3

您的结构的定义需要在编译器遇到您的 sizeof 代码时可见

所以,这个翻译单元应该可以工作:

struct ALMConfStr {
  int IntelRecsPerPg[MagicNumber];
};
// ...
uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);

无论是全部在一个文件中,还是结构在代码#include之前的标头 d 中sizeof

然而,这:

struct ALMConfStr;
// ...
uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);

不起作用,因为编译器不知道astruct ALMConfStr由什么组成,或者在那个上下文中 anIntelRecsPerPg可能是什么。

于 2013-01-29T18:27:06.260 回答
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 处可用。

于 2013-01-29T18:22:59.773 回答
0

从对无用的回答的评论中:

从我的头文件:

    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);
于 2013-01-29T19:09:33.413 回答