0

Test program which causes a EXC_BAD_ACCESS signal. Why does this cause a bus error? I want to change the 'HI' to '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;
}
4

3 回答 3

5

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

如果您更换:

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

有类似的东西:

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

或者:

char text[] = "HI";

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

于 2011-03-21T01:38:32.187 回答
1

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

利用

char text[] = "Hi!";

得到一个可修改的字符串。

于 2011-03-21T01:38:34.467 回答
0
char *text = (char *)"HI";
text[0] = 'f';

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

于 2011-03-21T01:39:49.650 回答