c应用程序在64位窗口中崩溃,但它在32位win服务器中工作正常

时间:2013-04-26 07:10:41

标签: c windows 64-bit 32bit-64bit

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

我的问题是:导致这种情况的原因是什么?为什么编码完全相同的程序在64位机器上的64位版本的内存中崩溃,而在32位机器上不是32位版本?是赢得32位服务器和赢得64位服务器有什么区别。请帮助我在两种类型的Windows操作系统中获得内存结构的差异。

版本信息:我正在使用Visual Studio 2010,赢得2008 R2

1 个答案:

答案 0 :(得分:1)

  

是什么原因引起的?为什么程序编码完全相同,在64位机器上的64位版本的内存中崩溃,而在32位机器上不是32位版本?

因为您的代码不正确。它偶然可以在32位上运行,但是使用不同的指针大小编译64位,会暴露代码中的错误。

  

win 32位服务器和赢得64位服务器有什么区别吗?请帮助我在两种类型的Windows OS中获得内存结构的差异。

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

端口从32位到64位发现的最常见的错误是指针截断。假设你有代码向ints投射指针。

int i = (int) p;

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

int* p = (int*) i;

你没有获得与你开始时相同的指针。从根本上说,问题是代码假设int(在Windows上为4字节宽)与指针大小相同。该假设适用于32位,但不适用于64位。

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

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