MSVC 中的结构打包

问题描述 投票:0回答:1

引导问题如何从反编译的原始字节正确解释此 WAVEFORMATEX?

在这个问题中,一条评论让我意识到

sizeof(WAVEFORMATEX)
不等于 18,Windows(似乎)是这么期望的。

但是,我没有指定 /Zp 或 /pack 开关,因此编译器应该使用默认对齐方式。 为什么我的系统报告

sizeof(WAVEFORMATEX) = 20
? 我在x86上。我的compile_commands.json 文件列出了以下内容:

{
  "directory": "E:\\FOO",
  "arguments": ["D:\\Programme\\Visual Studio 2022\\VC\\Tools\\MSVC\\14.40.33807\\bin\\HostX64\\x86\\cl.exe", "/c", "/nologo", "/Zi", "/FS", "/Fdbuild\\windows\\x86\\debug\\compile.foo.pdb", "/WX", "/Od", "/std:clatest", "/MTd", "/IFOO", "/DXAUDIO2_HELPER_FUNCTIONS", "/DWIN32_LEAN_AND_MEAN", "/DNOMINMAX", "/D_CRT_SECURE_NO_WARNINGS", "/DCOBJMACROS", "/DCINTERFACE", "/DDO_LOG", "/D_DEBUG", "/D_USE_MATH_DEFINES", "/IE:\\FOO\\build\\.packages\\z\\zlib\\v1.3.1\\55fd28c48bc34b35b89c569e2dd7bcce\\include", "/IE:\\FOO\\build\\.packages\\x\\xaudio2redist\\1.2.11\\163bc5c6e48e49d98ea66f724aede6bf\\include", "/Fobuild\\.objs\\foo\\windows\\x86\\debug\\FOO\\specific\\windows\\dxsound.c.obj", "FOO\\specific\\windows\\dxsound.c"],
  "file": "FOO\\specific\\windows\\dxsound.c"
},

我正在针对 x86_x64 进行编译并使用 C11 标准。

enter image description here

WAVEFORMATEX MSDN 页面

typedef struct tWAVEFORMATEX {
  WORD  wFormatTag;
  WORD  nChannels;
  DWORD nSamplesPerSec;
  DWORD nAvgBytesPerSec;
  WORD  nBlockAlign;
  WORD  wBitsPerSample;
  WORD  cbSize;
} WAVEFORMATEX, *PWAVEFORMATEX, *NPWAVEFORMATEX, *LPWAVEFORMATEX;
c winapi
1个回答
0
投票

DWORD
成员需要4字节对齐。这意味着整个结构需要 4 字节对齐,因此
nSamplesPerSec
将位于两个
WORD
成员之后从开头偏移 4 字节的位置。

由于结构体成员的大小加起来为 18,因此必须在大小上额外添加 2 个字节以获得 4 字节对齐。

© www.soinside.com 2019 - 2024. All rights reserved.