为什么我不能在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。