存储字符串字面量指针是否安全?示例代码是否符合C++标准定义?
结论
你提供的代码行为完全符合C++标准的明确定义,存储指向字符串字面量的指针本身是安全操作。
规则解释
你引用的标准条文已经覆盖了核心依据:
- 字符串字面量求值后生成的对象具备静态存储期,存储有效期覆盖整个程序运行周期,所以你在构造函数里拿到的字符串字面量指针,在程序退出前始终有效,不存在悬垂风险。
- 标准未明确的「相同字符串字面量是否共享存储、是否返回相同对象」的规则,仅影响相同内容字符串字面量的地址比较结果(属于未指定行为),完全不影响单个字符串字面量指针的有效性:无论是否和其他同内容字符串共享地址,你拿到的单个指针指向的内存始终合法。
需要留意的边界规则
- 绝对不能尝试修改字符串字面量指向的内容:字符串字面量的底层类型是
const char[N],强转掉const属性后修改其内容属于未定义行为,大部分实现里字符串字面量存在只读内存段,修改会直接触发程序崩溃。你的代码里用const char*存储指针是符合规范的写法,避免了误修改的风险。 - 相同内容的字符串字面量指针比较结果未指定:例如表达式
"test" == "test"的返回值标准没有做强制要求,不同编译器、不同编译选项下可能返回true也可能返回false,不要依赖这类比较的结果做逻辑判断。 - C++11及之后标准已经不允许将字符串字面量隐式转换为
char*,如果代码里出现char* p = "abc"这类写法属于不规范甚至编译错误,必须用const char*承接。
内容的提问来源于stack exchange,提问作者Mircea Ispas
相关产品推荐
相关产品推荐

