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

C语言字符串指针声明定义差异及段错误疑问

问题原因解析

首先要明确一个关键事实:C语言中的字符串字面量(比如"hello"),在现代编译器和操作系统的实现中,是被存储在只读数据段(通常是.rodata段)中的,这块内存区域被操作系统标记为不可写。

关于你提到的两种声明的误区

  1. char *p = "hello":
    虽然语法上允许用非const的char*指向字符串字面量,但这只是C标准为兼容旧代码保留的写法。实际上,字符串字面量本身是const char类型的,修改它属于未定义行为——现代系统会直接触发段错误来阻止这种非法操作。这个声明里的p指针本身确实可以修改(比如p = "world"是合法的),但它指向的内容不可写,这是很多旧教材描述不准确的地方。

  2. char *const p = "hello":
    这个声明里的p是常量指针(指针本身不可修改,不能指向其他地址),但它指向的依然是只读的字符串字面量。所以尝试通过*p = 'a'修改内容时,同样会因为访问只读内存触发段错误。

正确的可修改字符串写法

如果需要创建可修改的字符串,应该用数组初始化的方式:

char p[] = "hello";

此时字符串会被复制到栈(如果是局部变量)或全局可写数据段中,内存是可写的,修改*p = 'a'就不会有问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:07:07