我正在尝试编译一个与Visual C ++ 6.0编译器兼容的程序。 现在,我正在使用Visual Studio 2010的编译器编译它。它编译但是我的程序在分配变量时崩溃了:
sapHigh = ctx->saphigh;
在汇编代码中(使用Visual Studio Debugger),该指令由以下内容分解:
00410DF3 mov eax,dword ptr [ctx]
00410DF6 mov ecx,dword ptr [eax+20h]
00410DF9 mov dword ptr [sapHigh],ecx
指令“mov eax,dword ptr [ctx]”在eax中返回0x00000000并且程序崩溃。但调试器可以看到ctx指针的实际值,即“0x0172287a”。如果我用其实际值“0x0172287a”更改eax寄存器的值,程序仍然正常工作,直到下一次分配。
有人知道为什么这条指令不起作用?这是编译选项的问题吗?
感谢您的帮助。
答案 0 :(得分:2)
这是10到12年的长期差距。我建议您在VC10中编译程序并启用所有编译器警告,并尝试删除所有这些程序。它包括与弃用的东西,64位警告,性能警告和符合C ++标准的警告相关的所有警告。
答案 1 :(得分:0)
听起来变量ctx
的内存不再有效。如果ctx
是一些动态分配的结构的一部分,它是先前被释放的,或者它是一个引用或指向超出范围的堆栈变量的指针,那么就会发生各种未定义的行为。
如果(偶然)没有其他函数覆盖该内存,使用无效内存可能不会崩溃,但使用不同的编译器和不同的运行时库很容易导致不同的结果。
答案 2 :(得分:0)
如果您尝试lea eax, dword ptr[ctx]
怎么办?
此外,如果将指向数组的指针传递给函数,我也会遇到类似的问题。当在一个函数中定义数组时,一切都很好。