我们在 Visual Studio 调试器中发现了一些有趣的行为,如下所示。 我不确定它是代码还是某些调试器怪异(以前见过类似的东西)。 我们试图返回一个指向数组中值的指针。
奇怪的行为是在第二次调用 func() 之后 x 的值变为等于 y...至少,它在调试器中是这样显示的。
我想我的问题是,这是否合法/安全?
指针应该位于 main() 范围内的堆上,所以应该没问题吧?
char stuff[100];
char * func()
{
// i is random in the range
stuff[i] = 'a';
return &stuff[i];
}
main()
{
char * x = func();
char * y = func();
}
最佳答案
您是否使用调试版本进行调试?如果您调试发布版本,您通常会得到像这样令人惊讶的结果。
调试构建将强制编译器将所有变量放入堆栈,并在整个范围内保留它们,以便您获得预期的调试 View 。一旦一个变量永远不会被再次使用,发布版本可能会为一个变量重用该空间,即使它仍在范围内,并且可能将短期变量保留在处理器寄存器中而不是堆栈中。
在发布版本中,x
和 y
很可能被放置在相同的内存位置(或寄存器),因为它们的使用生命周期不重叠。没有必要在第一行之后保留 x
,因此允许编译器丢弃它。如果稍后在函数中使用 x
,那么它需要在堆栈上有自己的空间,因此您可能会在调试器中按预期看到它。
然后回答你的问题:是的,这是有效且正确的,只要 i
确实在范围内。
关于c++ - 返回 char*/Visual Studio 调试器异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3127393/