编译时的结构成员大小不起作用

时间:2013-01-29 18:19:38

标签: c

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

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

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

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

谢谢!

3 个答案:

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