关于C中的字符指针

考虑这个定义:

char *pmessage = "now is the time"; 

在我看来,pmessage将指向包含这些字符的内存中的连续区域和末尾的'\0' 。 所以我从中得出,只要我在这个区域的范围内,我就可以使用指针算法来访问该字符串中的单个字符。

那么为什么他们说(K&R)修改个别角色是不明确的?
此外,为什么当我运行以下代码时,我得到一个“分段错误”?

 *(pmessage + 1) = 'K'; 

C中的字符串文字不可修改。 字符串文字是在程序的源代码中定义的字符串。 编译器经常将字符串文字存储在已编译二进制文件的只读部分中,因此实际上您的pmessage指针将进入您无法修改的区域。 可以使用上面的语法修改存在于可修改内存中的缓冲区中的字符串。

尝试这样的事情。

 const char* pmessage = "now is the time"; // Create a new buffer that is on the stack and copy the literal into it. char buffer[64]; strcpy(buffer, pmessage); // We can now modify this buffer buffer[1] = 'K'; 

如果您只想要一个可以修改的字符串,则可以避免使用具有以下语法的字符串文字。

 char pmessage[] = "now is the time"; 

此方法直接将字符串创建为堆栈上的数组,并可在适当位置进行修改。

字符串是常量,无法修改。 如果要修改它,可以执行以下操作:

 char pmessage[] = "now is the time"; 

这会初始化一个字符数组(包括\ 0),而不是创建一个指向字符串常量的指针。

您可以使用指针算法从字符串文字中读取,但不能写入它。 C标准禁止修改字符串文字。

“string”文字在只读内存中定义,因此您不应该修改它。

pmessage的字面值进入代码,在大多数情况下,它们被放在代码存储器中。 哪个是只读的

当你写:char * pmessage =“现在是时候”;

编译器将其视为您写的:

  const char internalstring[] = "now is the time"; char *pmessage = internalstring; 

你无法修改字符串的原因是因为如果你要写:

  char *pmessage1 = "now is the time"; char *pmessage2 = "now is the time"; 

编译器会将其视为您写的:

  const char internalstring[] = "now is the time"; char *pmessage1 = internalstring; char *pmessage2 = internalstring; 

所以,如果你要换一个,你就改变了。

如果您定义表单的文字:

 char* message = "hello world"; 

编译器会将字符视为常量,并可能将它们放在只读内存中。

因此,建议使用const关键字,以便任何更改文字的尝试都将阻止程序编译:

 const char* message = "hello world"; 

我猜测文本中const的原因并不是作为语言的一部分强制执行,只是为了向后兼容C的预标准版本,其中const关键字不存在。 谁知道更好?