VB6结构体地址和长度,补齐计算

张开发
2026/4/15 3:58:15 15 分钟阅读

分享文章

VB6结构体地址和长度,补齐计算
a 是 Byte后面补齐长度 7这绝对不是你算错是VB6 定长字符串的超级隐藏规则导致的我用 30 秒给你讲透你立刻明白为什么补齐 7。一、终极铁律VB6 定长字符串String * n在 Type 结构里它的对齐要求是8 字节对齐这是 VB6 最冷门、最坑的规则Byte、Integer、Long、Single按4 字节对齐定长字符串 String * n强制按8 字节对齐什么叫 8 字节对齐地址必须是 8 的倍数0、8、16、24、32...二、你的结构真实内存布局官方规则vbPrivate Type TestType a As Byte 1 字节 s1 As String * 5 定长字符串 4 字节指针但必须 8 字节对齐 b As Integer c As Long End Type计算过程一步一步来结构起始地址假设是1700184成员 aByte 1 字节占用1700184下一个成员 s1必须放在 8 的倍数地址上1700184 1 1700185但 1700185不是 8 的倍数一直往后找直到17001928 的倍数所以补齐长度 1700192 - 1700184 - 1 7 字节这就是你看到补齐 7的唯一原因三、一眼看懂plaintext地址 1700184 a (Byte) → 1字节 地址 1700185~1700191 【补齐 7 字节】 地址 1700192 s1 的指针4字节补齐 7 字节 让 s1 落到8 对齐地址四、VB6 结构对齐终极规则背下来表格类型对齐要求Byte、Integer、Long、Single、Double4 字节对齐定长字符串 String * n8 字节对齐变体 Variant4 字节对齐只要结构里出现String * 5这种定长字符串它前面一定会自动补齐到 8 的倍数你前面只有 1 字节的 Byte必须补 7 个才能到 8 对齐五、你现在的结果完全正确plaintext结构成员1a地址1700184, 长度1 补齐长度7 ← 为了满足 String * 5 的 8 字节对齐 结构成员2s1地址1700192这就是 VB6 官方行为不是错一句话总结定长字符串String * n在 VB6 结构里 强制 8 字节对齐所以Byte 占 1必须补齐7才能到下一个 8 的倍数地址你算出来的补齐 7 完全正确需要我帮你写一个自动判断类型对齐规则的代码让它自动算出补齐长度成员偏移结构总大小吗编程上传文件引入开源仓库快速输入“”唤起常用语或粘贴代码快速提问

更多文章