为什么更改非const char*的分段错误?

Wil*_*Lou 2 c++ pointers const char

使用此代码,我得到一个分段错误:

   char* inputStr = "abcde";
   *(inputStr+1)='f';
Run Code Online (Sandbox Code Playgroud)

如果代码是:

   const char* inputStr = "abcde";
   *(inputStr+1)='f';
Run Code Online (Sandbox Code Playgroud)

我将收到"分配只读位置"的编译错误.但是,对于第一种情况,没有编译错误; 只是分配操作实际发生时的分段错误.

有谁能解释一下?

ser*_*gio 6

以下是标准中关于字符串文字的内容[2.13.4/2]:

不以u,U或L开头的字符串文字是普通的字符串文字,也称为窄字符串文字.普通的字符串文字具有"n const char数组"类型,其中n是下面定义的字符串的大小; 它具有静态存储持续时间(3.7)并使用给定的字符进行初始化.

所以,严格来说,"abcde"有类型

const char[6]
Run Code Online (Sandbox Code Playgroud)

现在你的代码中发生的是隐式转换

char*
Run Code Online (Sandbox Code Playgroud)

以便允许分配.其原因可能是与C的兼容性.另请参阅此处的讨论:http://learningcppisfun.blogspot.com/2009/07/string-literals-in-c.html

一旦完成转换,你在语法上可以自由地修改文字,但它失败了,因为编译器将文字存储在不可写的内存段中,正如标准本身所允许的那样.