c++ - 将指针作为参数传递给从属 dll 对象大小错误

标签 c++ c visual-studio-2010 visual-c++ master-slave

我有两个模块。一个调用另一个并传递一个结构作为参数。

struct {
    char* szDGRTag;
    bool bTagEx;
} ADPTAG;

Master 是从 98 年开始在 Visual C++ 6.0 中用 C++ 编写的。 Slave 是在 Visual Studio 2010 Professional 中用 C++ 11 编写的。
Slave中调用的函数:

long lCheckPresenceOfFields (char* szName, ADPTAG* AdpTagList, long lNbVar)

在大师中:

long lNbVar = 2;
ADPTAG* AdpTagList = NULL;
AdpTagList = new ADPTAG[lNbVar];

AdpTagList[0].szTag = new char[32];
AdpTagList[0].bTagEx = true;
memset(AdpTagList[0].szTag, 0x0, 32+1);
AdpTagList[0].szTag = NULL;

AdpTagList[1].szTag = new char[32]; 
AdpTagList[1].bTagEx = true;
memset(AdpTagList[1].szTag, 0x0, 32+1);
AdpTagList[1].szTag = NULL;

int size = sizeof(AdpTagList[0]);
AdpTagList[0].szTag = "DDD";
AdpTagList[1].szTag = "AAA";

long pres = pGetFieldsPresence(szPath, AdpTagList, 2);

我检查了Master中AdpTagList[0]的大小,它是5个字节,但在Slave中它是8个字节,所以第一个对象没问题,但任何下一个对象都不好,因为指针指向错误的内存区域。
这里可能有什么问题?不同的编译器?可能不像只有 char* 和 int 的结构在这两个模块之间工作得很好。
无论第一个对象 [0] 的大小如何,第二个对象 [1] 都是空指针。

最佳答案

您遇到了包装差异。您可以使用 "/Zp" compiler option 修改包装.

由于默认情况下 Visual Studio:

Packs structures on 8-byte boundaries

您的 Visual Studio 2010 编译器很可能没有指定打包。您的 Visual C++ 6.0 应用程序可能确实将 1 字节打包指定为包含 int 的结构,并且应将 char 打包到其中。

使用 1 字节打包可以优化程序的系统内存占用,因为填充不会丢失任何内存。

使用 8 字节打包可以优化速度,因为它增加了在单次加载中获取结构的机会。

有关包装的更多信息,您可以在这里阅读:https://msdn.microsoft.com/en-us/library/71kf49f1.aspx

但我同意微软的声明:

You should not use this option unless you have specific alignment requirements

这意味着,既然您必须更改一个,我建议您更改 Visual C++ 6.0 应用程序上的打包。

关于c++ - 将指针作为参数传递给从属 dll 对象大小错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37989936/

相关文章:

c++ - 当轮廓上的第一个点偏离曲线时如何解释自由字形轮廓

c++ - 模板多重定义问题

c - 基本时间复杂度?

Windows 7 多线程编程中的 C 高精度时间戳(以微秒为单位)

c# - 如果发生错误,则中止网络测试

c++ - 连续捕获 UIView 到纹理

c++ - 如何加快将文本文件加载到多 vector

c - 在哪里创建宏变量?和变量的大小?

asp.net - 从 ASP.NET 中的 URL 获取数据

c++ - 使用外部 *.lib 文件进行 Qt 部署