You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

返回局部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:21:49