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++ - 未初始化的互斥锁超出范围——清理?

c++ - 使用 C 或 C++ 的微 Controller

c - 尝试比较 C 中字符串数组的两个元素

c - 在 C 中使用指针打印二维数组

c - 如何通过 mmap 正确处理内存管理?

c# - 安装 Windows 10 Fall Creators Update 后无法运行任何 ASP.net MVC 应用程序

c# - 如何获取包含日期的单元格的值并使用 NPOI 保留原始格式

c++ - 是否有用于写入 STDOUT 或文件的 C++ 习惯用法?

c++ - Qt 创建者 - `multiple definition of qMain` 错误