假设您在 C++ 中有一个结构(使用 MFC,编译为 32 位),其定义如下:
#pragma pack (push, 1)
struct foo
{
float f;
int z;
DWORD k;
BYTE b;
int i;
};
#pragma pack (pop,1)
现在您在 Windows 中使用创建一个内存映射文件CreateFileMapping
,然后将此结构的内容写入此内存区域。这是一个全局可访问的内存映射。
现在您有了 C# 应用程序(编译为 32 位),并创建了一个类似于此的结构:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct foo
{
double f;
int z;
int k;
byte b;
int i;
}
现在,当 C# 读取内存映射数据时,它显示为已损坏。如果类型f
是double
,如上所述,则该特定成员的值是垃圾,其他成员具有正确的内容。如果将其更改为float
,则所有其他成员也包含垃圾。
我的问题,可能是 1 字节对齐导致了垃圾的读取吗?
不幸的是,我这里没有读取/写入内存映射的代码,但结构布局如上。
如果对齐在这里不是问题,什么可能导致它读取垃圾?尝试了几次改变各种成员的类型,没有任何区别。