【发布时间】:2018-09-13 01:27:31
【问题描述】:
我对下面的代码有点困惑:
#include <iostream>
const char* f()
{
const char* arr[]={"test"};
return arr[0];
}
int main()
{
auto x = f();
std::cout << x;
}
在我看来,这段代码应该是 UB(未定义的行为)。我们返回一个指向本地范围内的 C 样式数组元素的指针。事情应该出错了。但是,我测试过的编译器都没有抱怨(我在 g++ 和 clang 上都使用了-Wall -Wextra -pedantic)。 valgrind 也不抱怨。
上面的代码是有效的还是像人们想象的那样是 UB?
PS:运行它似乎会产生“正确”的结果,即显示“测试”,但这并不表示正确性。
【问题讨论】:
-
FWIW 它在实践中“工作”的原因是常量字符串“test”被存储在可执行文件的静态数据区域中,因此即使在函数返回后字符串仍然有效。 (当然,语言规范是否保证它可以工作是另一个问题)
-
问这些问题没有坏处,而且这个问题写得很好。 +1。
-
@JesperJuhl 我知道 UB 是什么,以及月球可能因此而爆炸的事实。我在问代码是否真的是UB。看起来不是。看起来很多人认为代码是 UB……所以我认为这个问题很有用。
-
@Bathsheba 看来我们还在学习 :) 确实代码 不是 UB。
-
@vsoftco:没想到是这样,但需要像 Barry 这样的专家来指出原因。
标签: c++ pointers memory undefined-behavior