我对下面的代码有点困惑:
#include <iostream>
const char* f()
{
const char* arr[]={"test"};
return arr[0];
}
int main()
{
auto x = f();
std::cout << x;
}
在我看来,这段代码应该是UB(未定义行为)。我们返回一个指向本地作用域内的 C 风格数组元素的指针。事情应该会出错。然而,我测试过的编译器都没有抱怨(我用过-Wall -Wextra -pedantic
在 g++ 和 clang 上)。valgrind
也不抱怨。
上面的代码是有效的还是像人们想象的那样是UB?
PS:运行它似乎会产生“正确”结果,即显示“测试”,但这并不表示正确性。
不,这不是UB。
This:
const char* f()
{
const char* arr[]={"test"};
return arr[0];
}
可以重写为等价的:
const char* f()
{
const char* arr0 = "test";
return arr0;
}
所以我们只是返回一个指向字符串文字的本地指针。字符串文字有静态存储时间 http://eel.is/c++draft/lex#string-8,没有任何东西悬挂。该功能实际上与以下相同:
const char* f()
{
return "test";
}
如果你做了类似的事情this:
const char* f() {
const char arr[] = "test"; // local array of char, not array of char const*
return arr;
}
Now that是 UB - 我们返回一个悬空指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)