C++数组相等运算符==:字符数组与字符串指针对比结果疑问
const char* 指向字符串字面量的行为说明
核心疑问解答
疑问1:const char *pca="test";是否等价于临时数组赋值写法?
完全不等价,二者有本质的内存布局差异:
你提到的临时数组写法:
const char temp[]="test"; const char *pca = temp;
- 会在栈内存上创建一块独立的字符数组空间,再把字符串字面量的内容逐字节拷贝到这块栈空间里,指针最终指向栈上的数组对象。如果代码中重复写两份完全相同的临时数组逻辑,编译器会在栈上分配两块独立的数组空间,对应的指针地址必然不相等。
- 直接将字符串字面量赋值给
const char*指针的写法,不存在栈上空间创建、内容拷贝的额外步骤,指针直接指向全局内存中的字符串字面量本体。
疑问2:字符串字面量是否为独立对象?pca和pcb是否指向同一个对象?
- 字符串字面量本身是具有静态存储期的独立只读对象,程序启动时就会被加载到进程的全局只读内存段,生命周期覆盖整个程序运行周期,不是临时存储在栈上的临时对象。
- 按照C++标准规定,编译器允许对内容完全一致的字符串字面量做去重合并(即字符串池优化):代码不同位置出现的相同内容字面量,会被映射到同一个全局只读内存对象上,无需重复占用存储空间。你代码中pca和pcb正是因为都指向了被合并后的同一个"test"字面量的首元素地址,所以相等判断结果为1。
- 需要明确的是:相同字面量的地址合并是编译器的可选优化,并非标准强制要求。如果编译器关闭了这项优化,哪怕内容完全相同的两个字面量,也会被存储为独立的全局对象,此时pca和pcb的地址就会不相等。不过主流编译器(GCC、Clang、MSVC)在默认发布构建配置下都会开启这项优化,日常测试时通常能观察到pca == pcb为真的结果。
补充易混淆点:
- 栈上数组初始化
const char ca[] = "test"的过程,本质是把全局只读区的字面量内容拷贝一份到栈上的独立数组,ca和cb是两个完全独立的栈对象,所以首地址必然不同,这也是你观察到ca == cb输出0的原因。- 绝对不要尝试通过
const char*指针修改指向的字符串字面量内容,因为字面量存储在只读内存段,这类写操作属于未定义行为,程序大概率会触发段错误崩溃。
内容的提问来源于stack exchange,提问作者Lookout
相关产品推荐
相关产品推荐

