lhwaizhu 发表于 2012-11-25 21:02:46

430结构体的问题

本帖最后由 lhwaizhu 于 2012-11-25 21:11 编辑

#defineuint8    unsigned char
#defineuint16   unsigned int
#defineuint32   unsigned long int   

#pragma pack(1)

typedef struct
{
        uint8 Name;
        uint8 Type;
} FILE_NAME;

typedef struct
{
        uint16 Start;
        uint32 Size;
} FILE_POSIT;

typedef struct
{
        FILE_NAME FileName;
        uint8 FileAttrib;
        uint8 UnUsed;
        uint8 FileUpdateTime;
        uint8 FileUpdateData;
        FILE_POSIT FilePosit;
} DIR;

这里定义了BUFFER里面有32个字节,执行    DIR*ID = *(DIR*)BUFFER;结果发现ID里面的数据不对,我已经用#pragma pack(1)声明了字节对齐了,为什么还不对啊?请教下,谢谢了

xizi 发表于 2012-11-25 21:42:28

不懂DIR*ID = *(DIR*)BUFFER;是要做什么?为什么不是DIR*ID = (DIR*)BUFFER;?

lhwaizhu 发表于 2012-11-25 22:08:17

xizi 发表于 2012-11-25 21:42 static/image/common/back.gif
不懂DIR*ID = *(DIR*)BUFFER;是要做什么?为什么不是DIR*ID = (DIR*)BUFFER;?

不好意思 写错了 是*ID = *(DIR*)BUFFER;

xizi 发表于 2012-11-27 00:53:31

你仍然省略了一些细节,只好猜测了。
1。估计你在*ID = *(DIR*)BUFFER;之前应该定义了DIR * ID;否则不仅是数据不对的问题,而是编译通不过。
2。虽然你定义了DIR * ID;但是这个指针没有被初始化。然后你执行*ID = *(DIR*)BUFFER;则引发了空指针操作。后果就可想而知了。
提个建议,发有代码的帖子,最好不要重新录入,而应复制粘贴,或直接上传源文件。否则会引入新的错误,或遗漏很多细节。

jetlib 发表于 2012-11-27 08:27:03

大概楼主没明白我上次回复所说的意思。楼主是想把一个内存块按结构体方式来访问内部成员,但是430上最好别这样做,除非你做好了WORD对齐。否则,如果结构体中的某个双字节变量,如果恰好在奇地址上,按字方式访问该双字节变量会出错,那是因为编译器翻译时直接按mov.w方式来访问该变量,而mov.w访问时,地址必须是偶地址,如果不是,会强行变成偶地址,造成访问错误。所以在430上,最后别直接将一个内存块按结构体方式直接访问。除非,你确认各成员变量已经按2字节对齐了。
页: [1]
查看完整版本: 430结构体的问题