为什么我不能在char *中编辑char?

时间:2011-09-20 05:37:54

标签: c gcc c-strings

以下是一个非常简单的例子。它在Mac OS X(Snow Leopard)上使用gcc编译得很好。在运行时它输出总线错误:10。这里发生了什么?

char* a = "abc";
a[0] = 'c';

5 个答案:

答案 0 :(得分:7)

您的代码将a设置为指向"abc"的指针,这是无法修改的文字数据。当您的代码违反此限制时会发生总线错误,并尝试修改该值。

试试这个:

char a[] = "abc";
a[0] = 'c';

创建一个char数组(在程序的普通数据空间中),字符串文字的内容复制到数组中。 现在您可以毫不费力地对其进行更改。

答案 1 :(得分:3)

您正在尝试修改字符串常量。请改用:

char a[] = "abc";
a[0] = 'c';

答案 2 :(得分:3)

这个

char* a = "abc";

依赖于从const char[](字符串文字的类型)到char*的危险隐式转换。 (在C ++中,这种转换已被弃用了十多年。但我不知道C语言。)

不得更改字符串文字。

答案 3 :(得分:1)

char * a =“abc”;是存储在ELF二进制文件的.data部分中的常量字符串。您不能修改此内存,如果您在某些情况下会产生未定义的行为,它将不会出现错误但不会修改内存,因为您尝试访问通常无法访问的内存时遇到总线错误(对于写作目的)

答案 4 :(得分:1)

char * str =“string”;在这种情况下,它被视为只读文字。它类似于编写'const char * str =“string”'。也就是说指针'str'指向的值是常量。尝试编辑将导致BUS ERROR。