返回局部C风格数组指针是否会产生悬空指针?
你的代码其实没有未定义行为!
哎,你这里应该是混淆了两种局部数组的场景,咱们一点点拆解清楚:
1. 先看你代码里的局部数组是什么
函数f()里的const char* arr[]={"test"};定义的是一个局部指针数组——它的每个元素都是const char*类型的指针,而不是直接存储字符串的字符数组。这个数组arr本身确实是局部的,会在函数执行完毕后被销毁,但它存储的内容是字符串字面量"test"的内存地址。
2. 字符串字面量的生命周期是全局的
C++标准明确规定,像"test"这样的字符串字面量具有静态存储期:它们会被存放在程序的只读数据段中,从程序启动到终止全程都存在。所以arr[0]指向的这个地址,在整个程序运行期间都是有效的,哪怕函数f()已经退出。
3. 你可能搞混了另一种UB场景
你误以为这段代码是UB,大概率是把它和下面这种情况搞混了:
const char* f() { char arr[] = "test"; // 这是栈上的局部字符数组,存储的是字符串的副本 return arr; // 返回指向局部数组的指针,这才是真正的UB! }
这种情况下,arr是存储在栈上的字符数组,函数退出后栈空间被回收,返回的指针指向的是已经失效的内存,这才会触发未定义行为。但你的代码和这个场景完全不同。
4. 为什么编译器和valgrind都没反应?
因为你的代码本身是完全合法的,没有任何未定义行为。-Wall -Wextra -pedantic这些警告选项只会针对确实有风险的代码,而valgrind也只会检测非法内存访问的情况——这里你访问的是合法的静态存储区,所以自然不会有警告或报错。
内容的提问来源于stack exchange,提问作者vsoftco
相关产品推荐
相关产品推荐

