为什么指针在函数转换期间会自行改变?

时间:2008-10-18 06:57:18

标签: c++ pointers

在下面的例子中,我正在调用一个Func并将指针传递给它,但在被调用的函数中,该参数将指针值显示为完全虚假的东西。像下面的东西。

bool flag = Func(pfspara);--> pfspara = 0x0091d910 

bool Func(PFSPARA pfspara) --> pfspara = 0x00000005
{
    return false;
}

为什么pfspara会改变某些虚假指针?我无法在调试中重现问题,只能在生产中重现。

感谢。

5 个答案:

答案 0 :(得分:8)

如果您尝试在Visual Studio中调试优化代码,则无法始终依赖调试器正确显示变量值 - 尤其是在变量未使用时,尤其如此,编译器可能会将其优化掉。

尝试运行此代码:

bool Func(PFSPARA pfspara)
{
    printf("%x\n", pfspara);
    return false;
}

答案 1 :(得分:1)

一般来说,这绝不会发生。可能导致此类症状的问题包括调用和调用程序模块之间的编译选项不兼容,成员函数指针的错误转换或简单的编译器错误。 您需要提供有关问题的更多详细信息:显示实际代码,指定编译器,指定调试与生产编译标志等等。

答案 2 :(得分:0)

除了Rasmus的评论之外,我发现通常值得检查问题是否出现在调试版本以及发布版本中。如果您发现版本构建中发生了真正的问题,但调试版本中没有,那么通常会遇到优化过程暴露的错误,例如未初始化的变量。在调试版本中进行大多数测试时存在真正的危险,以避免您在此处看到的问题,然后发布版本构建。国际海事组织,如果你没有一个好的回归测试套件(最好是自动化的),我会避免提供最优化的代码。

答案 3 :(得分:0)

这听起来像是一个缓冲区溢出问题 - 有些东西会覆盖该变量。但正如其他答案中所提到的,如果没有一些实际的代码可以使用,就无法确定。

答案 4 :(得分:0)

听起来像你在堆栈上乱涂乱画......在你的代码中的某处,堆栈上的缓冲区溢出,或者你正在获取堆栈上的对象的地址并在函数之后写入它回报。这会导致堆栈损坏。

它可能只在发布模式下发生,因为堆栈分配由于优化和排除用于帮助检查此类条件的“保护”块而不同。