c++ - 返回 char*/Visual Studio 调试器异常

标签 c++ c visual-studio visual-c++ pointers

我们在 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 。一旦一个变量永远不会被再次使用,发布版本可能会为一个变量重用该空间,即使它仍在范围内,并且可能将短期变量保留在处理器寄存器中而不是堆栈中。

在发布版本中,xy 很可能被放置在相同的内存位置(或寄存器),因为它们的使用生命周期不重叠。没有必要在第一行之后保留 x,因此允许编译器丢弃它。如果稍后在函数中使用 x,那么它需要在堆栈上有自己的空间,因此您可能会在调试器中按预期看到它。

然后回答你的问题:是的,这是有效且正确的,只要 i 确实在范围内。

关于c++ - 返回 char*/Visual Studio 调试器异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3127393/

相关文章:

c# - 在 C# 中使用结构数组动态生成 UI 组件

转换具有不同返回类型的函数指针

c++ - LNK2019 : Calling C function from CPP code

javascript - 如何使用 WebKit 在 JavaScript 中调用 C++ 函数?

visual-studio - 仅检入文件的一部分

使用 c++ 类,以便在实例化时产生编译错误

c++ - 如何在初始化后更改数组元素

visual-studio - 如何让 Visual Studio 将 DLL 文件复制到输出目录?

c++ - 当我的代码仅请求一个内存分配时,为什么valgrind报告两个内存分配?

c - 在哪里放置包含语句、标题或源代码?