使用指针字符串时为何无法对char做减法?出现SIGSEGV段错误
为什么修改字符串字面量会触发段错误?
问题核心在于两种字符串声明方式的内存存储属性差异:
当你写
char *input = "Quebec";时,"Quebec"是字符串字面量,C标准明确规定这类字面量属于只读数据。编译器会把它放到程序的只读内存段(例如.rodata),此时input指针指向的是这块受保护的只读区域。当你执行input[i] -= 32;试图修改其中内容时,操作系统会拦截这种非法的只读内存写入操作,直接抛出SIGSEGV段错误,对应退出码139。换成
char input[256] = "Quebec";后,编译器会把字符串字面量的内容完整拷贝到栈上的数组空间里。栈内存属于可读写区域,所以修改数组元素不会触发内存访问限制,程序就能正常运行。
额外提醒:部分编译器可能会把字符串字面量放到可写区域,但这是不符合C标准的非标准行为,依赖具体平台和编译选项。为了代码的可移植性和安全性,永远不要尝试修改字符串字面量。如果需要修改字符串内容,优先用数组存储,或者通过malloc分配可写内存后再拷贝字符串进去。
内容的提问来源于stack exchange,提问作者Vladyslav
相关产品推荐
相关产品推荐

