0

我用 C 编写了一个 win 服务器应用程序。我必须将它编译成 .dll,并且作为 32 位机器上的 32 位 .dll,它运行良好。但是,当我使用 cmake 工具编译为 64 位并将相同的代码放入 64 位机器并指定它编译为 64 位时,我运行该程序时,它会在释放一些内存的行上崩溃。

我的问题是:是什么原因造成的?为什么一个代码完全相同的程序在 64 位机器上的 64 位版本的可用内存上崩溃,而不是在 32 位机器上的 32 位版本上崩溃?win 32 位服务器和 win 64 位服务器有什么区别吗?请帮助我了解两种 Windows 操作系统中内存结构的差异。

版本信息:我使用的是 Visual Studio 2010,win 2008 R2

4

1 回答 1

1

这是什么原因造成的?为什么以完全相同的方式编码的程序会在 64 位机器上的 64 位版本的可用内存上崩溃,而不是在 32 位机器上的 32 位版本上崩溃?

因为你的代码不正确。碰巧它可以在 32 位上工作,但是为 64 位编译,具有不同的指针大小,会暴露代码中的错误。

win 32位服务器和win 64位服务器有区别吗?请帮助我了解两种 Windows 操作系统中内存结构的差异。

主要区别在于指针在 32 位上是 32 位宽,在 64 位上是 64 位宽。显然还有许多其他差异,但从您的角度来看,重要的是指针大小。

从 32 位到 64 位的端口发现的最常见的错误是指针截断。假设您有将指针转换为整数的代码。

int i = (int) p;

当编译为 32 位时,这恰好在运行时工作,但在 64 位上,你丢失了一半的指针。当您稍后转换回指针时

int* p = (int*) i;

您不会得到与开始时相同的指针。从根本上说,问题在于代码假设int在 Windows 上为 4 字节宽的 a 与指针大小相同。该假设适用于 32 位,但不适用于 64 位。

您可能会遇到这个问题,也很可能会遇到其他更微妙的问题。为了解决问题,您需要详细调试该过程。

我认为您正在寻找一些可以使您的程序正常工作的简单开关。没有神奇的解决方案,因为问题在于您的代码。因此需要仔细调试。

于 2013-04-26T07:33:53.323 回答