以下是一个非常简单的例子。它在Mac OS X(Snow Leopard)上使用gcc编译得很好。在运行时它输出总线错误:10。这里发生了什么?
char* a = "abc";
a[0] = 'c';
答案 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。