5

在以下情况下,我Func使用传递给它的指针调用 a,但在被调用函数中,参数将指针值显示为完全虚假的东西。像下面的东西。

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

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

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

谢谢。

4

5 回答 5

8

如果您尝试在例如 Visual Studio 中调试优化代码,则不能总是依赖调试器正确显示变量的值——尤其是在变量未使用时编译器可能会将其优化掉。

尝试运行它:

bool Func(PFSPARA pfspara)
{
    printf("%x\n", pfspara);
    return false;
}
于 2008-10-18T07:25:50.513 回答
1

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

于 2008-10-18T07:22:53.857 回答
0

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

于 2008-10-18T20:35:53.660 回答
0

对我来说,这听起来像是你在堆栈上乱写......在你的代码中的某个地方堆栈上的缓冲区溢出,或者你正在获取堆栈上对象的地址并在函数返回后写入它。这会导致您的堆栈损坏。

它可能仅在释放模式下发生,因为由于优化和排除用于帮助检查这种情况的“保护”块,堆栈分配是不同的。

于 2008-10-19T12:10:51.667 回答
0

除了 Rasmus 的评论之外,我发现通常值得检查问题是否出现在调试版本以及发布版本中。如果您在发布版本中发现真正的问题,但在调试版本中没有,这通常是由于优化过程暴露的错误,例如未初始化的变量。在调试版本中进行大部分测试,以避免您在此处看到的问题,然后发布发布版本,这是一个真正的危险。IMO,如果您没有一个好的回归测试套件(最好是自动化的),我会避免发送优化代码。

于 2008-10-18T08:29:56.140 回答