英特尔Mac上的总线错误,为什么?

时间:2011-03-21 01:36:49

标签: c++ string bus-error

导致EXC_BAD_ACCESS信号的测试程序。 为什么这会导致总线错误?我想将'HI'改为'fI'。

//BUS ERROR TEST

#include <iostream>

void test(char *text)
{
    text[0] = 'f';
}

int main()
{
    char *text = (char *)"HI";
    test(text);
    std::cout << text << std::endl;
    return 0;
}

3 个答案:

答案 0 :(得分:5)

不允许更改字符串常量,这是标准的未定义行为。

如果替换:

char *text = (char *)"HI";

有类似的东西:

char text[3];
strcpy (text, "HI");

或:

char text[] = "HI";

你会发现它会起作用,因为在这种情况下text是可修改的内存。

答案 1 :(得分:1)

你不能抛弃const,而是UB。字符串常量是只读的,因此允许编译器将它们放入只读存储器中。

使用

char text[] = "Hi!";

获取可修改的字符串。

答案 2 :(得分:0)

char *text = (char *)"HI";
text[0] = 'f';

这实际上违反了C ++标准。出于某种原因,引用的字符串被声明为const。在您的情况下,它可能将字符串存储为“代码数据”的一部分,而不是常规的“数据”。这与将“代码数据”区域设置为只读的常见用法相结合,使得您无法写入带引号的常量字符串。