【问题标题】:Bus Error on Intel Mac, why?英特尔 Mac 上的总线错误,为什么?
【发布时间】:2011-03-21 01:36:48
【问题描述】:

导致 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;
}

【问题讨论】:

    标签: c++ string bus-error


    【解决方案1】:

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

    如果你替换:

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

    类似:

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

    或:

    char text[] = "HI";
    

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

    【讨论】:

      【解决方案2】:

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

      使用

      char text[] = "Hi!";
      

      获取可修改的字符串。

      【讨论】:

        【解决方案3】:
        char *text = (char *)"HI";
        text[0] = 'f';
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-19
          相关资源
          最近更新 更多