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)声明了字节对齐了,为什么还不对啊?请教下,谢谢了
不懂DIR*ID = *(DIR*)BUFFER;是要做什么?为什么不是DIR*ID = (DIR*)BUFFER;? xizi 发表于 2012-11-25 21:42 static/image/common/back.gif
不懂DIR*ID = *(DIR*)BUFFER;是要做什么?为什么不是DIR*ID = (DIR*)BUFFER;?
不好意思 写错了 是*ID = *(DIR*)BUFFER; 你仍然省略了一些细节,只好猜测了。
1。估计你在*ID = *(DIR*)BUFFER;之前应该定义了DIR * ID;否则不仅是数据不对的问题,而是编译通不过。
2。虽然你定义了DIR * ID;但是这个指针没有被初始化。然后你执行*ID = *(DIR*)BUFFER;则引发了空指针操作。后果就可想而知了。
提个建议,发有代码的帖子,最好不要重新录入,而应复制粘贴,或直接上传源文件。否则会引入新的错误,或遗漏很多细节。 大概楼主没明白我上次回复所说的意思。楼主是想把一个内存块按结构体方式来访问内部成员,但是430上最好别这样做,除非你做好了WORD对齐。否则,如果结构体中的某个双字节变量,如果恰好在奇地址上,按字方式访问该双字节变量会出错,那是因为编译器翻译时直接按mov.w方式来访问该变量,而mov.w访问时,地址必须是偶地址,如果不是,会强行变成偶地址,造成访问错误。所以在430上,最后别直接将一个内存块按结构体方式直接访问。除非,你确认各成员变量已经按2字节对齐了。
页:
[1]