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

字符串字面量与指针的区别及初始化异常问题咨询

字符串字面量与指针的核心区别,以及你遇到的编译错误解析

首先咱们把字符串字面量和指针的关系掰扯明白:

  • 字符串字面量(比如"Hello")本质是一个只读的字符数组,编译器会把它放在程序的只读数据段(比如Linux系统里的.rodata段),它的实际类型是const char[N](N是字符总数加1,包含结尾的终止符'\0')。
  • 当你写char *str = "Hello"时,其实是把这个只读数组的首元素地址赋值给了str指针。这里要注意:C语言出于历史兼容原因,允许用非const指针指向字符串字面量,但这是个有风险的语法糖——你绝对不能通过这个指针修改字符串字面量的内容,因为它所在的内存是只读的。

接下来说说你提到的(*2)合法、(*3)不合法的情况(根据常见的编译错误场景推测,应该是以下两种典型代码):
假设(*2)是这段代码:

char arr[] = "Hello";
arr[0] = 'h'; // 完全合法

这是因为char arr[] = "Hello"的行为是:在栈(或全局可写数据段)上创建一个普通字符数组,然后把字符串字面量的内容完整拷贝到这个数组里。这个数组属于可修改的内存空间,你完全可以修改它的元素,所以编译器不会报错。

而(*3)大概率是这段代码:

char *str = "Hello";
str[0] = 'h'; // 不合法,编译直接报错

为什么不行?因为str指向的是只读数据段里的字符串字面量本身。虽然指针str的类型是非const的,但它指向的内存是只读属性。修改只读内存属于C语言里的"未定义行为",现代编译器会直接在编译阶段拦截这个操作(比如GCC会提示assignment of read-only location '*str'),就算侥幸编译通过,运行时也会触发段错误(Segmentation Fault)。

最后总结两个关键用法的区别:

  • char arr[] = "字面量":创建可修改的数组,拷贝字面量内容,属于你的"可操作内存"。
  • char *str = "字面量":让指针指向只读的字面量本身,只能读取,不能修改。

内容的提问来源于stack exchange,提问作者ynn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:48:59