关于C中的字符指针

时间:2009-04-15 16:00:50

标签: c arrays pointers

考虑这个定义:

char *pmessage = "now is the time";

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

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

*(pmessage + 1) = 'K';

7 个答案:

答案 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关键字不存在。谁知道更好?