C语言字符串指针声明定义差异及段错误疑问
问题原因解析
首先要明确一个关键事实:C语言中的字符串字面量(比如"hello"),在现代编译器和操作系统的实现中,是被存储在只读数据段(通常是.rodata段)中的,这块内存区域被操作系统标记为不可写。
关于你提到的两种声明的误区
char *p = "hello":
虽然语法上允许用非const的char*指向字符串字面量,但这只是C标准为兼容旧代码保留的写法。实际上,字符串字面量本身是const char类型的,修改它属于未定义行为——现代系统会直接触发段错误来阻止这种非法操作。这个声明里的p指针本身确实可以修改(比如p = "world"是合法的),但它指向的内容不可写,这是很多旧教材描述不准确的地方。char *const p = "hello":
这个声明里的p是常量指针(指针本身不可修改,不能指向其他地址),但它指向的依然是只读的字符串字面量。所以尝试通过*p = 'a'修改内容时,同样会因为访问只读内存触发段错误。
正确的可修改字符串写法
如果需要创建可修改的字符串,应该用数组初始化的方式:
char p[] = "hello";
此时字符串会被复制到栈(如果是局部变量)或全局可写数据段中,内存是可写的,修改*p = 'a'就不会有问题。
内容的提问来源于stack exchange,提问作者blazingcannon
相关产品推荐
相关产品推荐

