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

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

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

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

试试这个:

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

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

您正在尝试修改字符串常量。 改为使用它:

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

这个

 char* a = "abc"; 

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

不得更改字符串文字。

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

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