8

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

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

5 回答 5

10

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

试试这个:

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

这将创建一个 char 数组(在您程序的正常数据空间中),并将字符串文字的内容复制到您的数组中。 现在您应该可以毫无困难地对其进行更改。

于 2011-09-20T05:44:57.947 回答
3

您正在尝试修改字符串常量。改用这个:

char a[] = "abc";
a[0] = 'c';
于 2011-09-20T05:40:20.880 回答
3

char* a = "abc";

依赖于从const char[](字符串文字的类型)到char*. (在 C++ 中,这种转换已被弃用十多年。不过,我不了解 C。)

不得更改字符串文字。

于 2011-09-20T05:54:55.717 回答
1

char *a = "abc"是存储在.dataELF 二进制文件部分中的常量字符串。您不允许修改此内存,如果您这样做,在某些情况下会发生未定义的行为,它不会给出错误但不会修改内存,因为您正在尝试访问通常无法访问的内存(例如写作目的)。

于 2011-09-20T05:41:37.330 回答
1

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

于 2011-09-20T06:43:34.557 回答