考虑这个定义:
char *pmessage = "now is the time";
正如我所看到的,pmessage将指向内存中包含这些字符的连续区域,并在末尾指向'\0'
。所以我从中得出,只要我在这个区域的范围内,我就可以使用指针算法来访问该字符串中的单个字符。
那么为什么他们说(K& R)修改个别角色是不明确的? 此外,为什么当我运行以下代码时,我得到一个“分段错误”?
*(pmessage + 1) = 'K';
答案 0 :(得分:17)
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";
此方法直接在堆栈上将字符串创建为数组,并且可以在适当的位置进行修改。
答案 1 :(得分:9)
字符串是常量,无法修改。如果要修改它,可以执行以下操作:
char pmessage[] = "now is the time";
这会初始化一个字符数组(包括\ 0),而不是创建指向字符串常量的指针。
答案 2 :(得分:1)
您可以使用指针算法从字符串文字中读取,但不能写入。 C标准禁止修改字符串文字。
答案 3 :(得分:1)
“string”文字在只读内存中定义,因此不应修改它。
答案 4 :(得分:1)
pmessage的字面值进入代码,在大多数情况下,它们被放在代码存储器中。哪个只读
答案 5 :(得分:0)
当你写: 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;
所以,如果你要换一个,你就改变它们。
答案 6 :(得分:0)
如果您定义表单的文字:
char* message = "hello world";
编译器会将字符视为常量,并且可能将它们放在只读存储器中。
因此,建议使用const关键字,以便任何更改文字的尝试都将阻止程序编译:
const char* message = "hello world";
我猜测文字中的const不作为语言的一部分强制执行的原因只是为了向后兼容C的预标准版本,其中const关键字不存在。谁知道更好?