下面是一个非常简单的例子。它在 Mac OS X (Snow Leopard) 上使用 gcc 编译得很好。在运行时它会输出 Bus error: 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"
是存储在.data
ELF 二进制文件部分中的常量字符串。您不允许修改此内存,如果您这样做,在某些情况下会发生未定义的行为,它不会给出错误但不会修改内存,因为您正在尝试访问通常无法访问的内存(例如写作目的)。
char *str = "string";
在这种情况下,它被视为只读文字。它类似于写作const char *str = "string"
。也就是说指针指向的值str
是一个常数。尝试编辑将导致 BUS ERROR。