问一个struct的简单问题

assiwe 2010-11-10 10:52:03
我写了一个函数

template<typename T>
inline T Read(T* x, std::ifstream* stream)
{
char buffer[sizeof(T)];
stream->read(buffer,sizeof(T));
T* p = (T*) buffer;
*x = *p;
return *x;
}
和一个struct

typedef struct fileHeader
{
uint32_t sign;
uint16_t W1;
uint32_t RecordCount;
uint16_t HeaderLength;
uint16_t RecordLength;
uint16_t FieldCount;
}FileHeader;



请问为什么调用

FileHeader s;
Read(&(s.sign),&myStream);
Read(&(s.W1 ),&myStream);
Read(&(s.RecordCount ),&myStream);
Read(&(s.HeaderLength ),&myStream);
Read(&(s.RecordLength ),&myStream);
Read(&(s.FieldCount ),&myStream);




FileHeader s;
Read(&s,&myStream);


s的成员的值从RecordCount开始有些不一样呢?

...全文
50 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
pluminsnow 2010-11-10
  • 打赏
  • 举报
回复
结构体内部存储结构涉及到一个字节对齐的问题,为了保持字节对齐,你的结构体在内存中并不是连续存储结构体中的基本数据的,你了解一下字节对齐的知识就明白了。
你的结构体有些多出的填充内容,这部分内容并不是你想要的,但它在内存中实实在在存在,而你的函数确是按照连续读取的模式做的,所以你读取到了一部分填充的内容,所以你感觉数据不对。
你可以查一下#pragma pack()这个指令。
另外你也可以依次打印出你结构体一个实例中的所有基本数据的地址来看看,也会有所领悟。
最后,如果你只是想要解决这个出现的问题,你可以在你的结构体代码之前加上#pragma pack(1),在结构体代码之后加上#pragma pack()即可

#pragma pack(1)
typedef struct fileHeader
{
uint32_t sign;
uint16_t W1;
uint32_t RecordCount;
uint16_t HeaderLength;
uint16_t RecordLength;
uint16_t FieldCount;
}FileHeader;
#pragma pack()
Jim_King_2000 2010-11-10
  • 打赏
  • 举报
回复
google "结构体 填充"

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧