导致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;
}
答案 0 :(得分:5)
不允许更改字符串常量,这是标准的未定义行为。
如果替换:
char *text = (char *)"HI";
有类似的东西:
char text[3];
strcpy (text, "HI");
或:
char text[] = "HI";
你会发现它会起作用,因为在这种情况下text
是可修改的内存。
答案 1 :(得分:1)
答案 2 :(得分:0)
char *text = (char *)"HI";
text[0] = 'f';
这实际上违反了C ++标准。出于某种原因,引用的字符串被声明为const
。在您的情况下,它可能将字符串存储为“代码数据”的一部分,而不是常规的“数据”。这与将“代码数据”区域设置为只读的常见用法相结合,使得您无法写入带引号的常量字符串。