字符串字面量与指针的区别及初始化异常问题咨询
字符串字面量与指针的核心区别,以及你遇到的编译错误解析
首先咱们把字符串字面量和指针的关系掰扯明白:
- 字符串字面量(比如
"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
相关产品推荐
相关产品推荐

