下面是一个非常简单的例子。 在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 *str = "string";
在这种情况下,它被视为一个只读的文字。这类似于写 const char *str = "string"
. 也就是指针指向的值是 str
是一个常数。试图编辑将导致总线错误。
char *a = "abc"
是一个常量字符串,存储在 .data
ELF二进制的部分。你不允许修改这个内存,如果你这样做,你会招致未定义的行为,在某些情况下,它不会给出错误,但不会修改内存,在你的情况下,你会得到一个总线错误,因为你试图访问内存,你通常不能(为了写的目的)。