【问题标题】:Bus error when dereferencing the same address取消引用同一地址时出现总线错误
【发布时间】:2022-12-14 10:22:41
【问题描述】:

我正在尝试来自 K&R 的 squeeze 程序。但是,我不断收到总线错误。下面的代码直接触发了问题。这不应该是便携式的吗?

int main() {
    char* str = "foo";
    for (int i = 0, j = 0; str[i]; ++i)
        str[j] = '.';
}

书中的功能:

void squeeze(char s[], int c)
{
    int i, j;

    for (i = j = 0; s[i] != '\0'; i++)
        if (s[i] != c)
            s[j++] = s[i];
    s[j] = '\0';
}

【问题讨论】:

标签: c


【解决方案1】:

str 指向一个字符串常量。此类常量是只读的,因此尝试修改它们会触发 undefined behavior,在您的特定情况下,它会在程序崩溃时出现。

相反,将 str 声明为一个数组,可以对其进行修改:

char str[] = "foo";

【讨论】:

  • 我从来不明白这一点,它似乎不是硬件的限制而是 C 本身的限制。有什么不同的原因吗?编译器是否只是将其转换为push 0x666F6F00(或正在使用的任何程序集中的等效项?)
  • 这奏效了!这是否意味着它们的功能教导未定义的行为?
  • @puppydrum64 编译器通常会将字符串文字放置在标记为只读的内存区域中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2012-05-26
  • 1970-01-01
  • 2016-01-19
  • 2019-02-20
  • 2011-05-24
  • 2014-05-20
相关资源
最近更新 更多