【问题标题】:C - K&R exercise 2.4 - why am I getting a bus error?C - K&R 练习 2.4 - 为什么会出现总线错误?
【发布时间】:2011-09-27 14:49:59
【问题描述】:

为什么会出现总线错误?有问题的行在代码中标出。

练习 2-4。 编写一个替代版本的squeeze(s1,s2),删除s1中与字符串s2中任何字符匹配的每个字符。

    #include <stdio.h>

    /*
     * Detects if a char is inside a string
     */
    char in_string(char c, char s[]) {
        int i = 0;
        while (s[i] != '\0') {
            if (s[i++] == c)
                return 1;
        }
        return 0;
    }

    /*
     * Returns the string s without any chars that are in map
     */
    void squeeze(char s[], char map[]) {
        int i, j;

        for (i = j = 0; s[i] != '\0'; i++) {
            if (! in_string(s[i], map)) {
                s[j++] = s[i]; // <--- Bus Error
            }
        }
        s[j] = '\0';

        printf("%s\n", s);
    }

    main() {
        squeeze("XALOMR", "AO");
        squeeze("EWRTOG", "RGV");
    }

【问题讨论】:

  • 问题在标题中说明,有问题的行在代码中标出。不过,我正在尝试修复的格式存在问题。

标签: c segmentation-fault bus-error


【解决方案1】:

因为"XALOMR" 是一个字符串字面量(它是只读的)并且您不能修改它(就像您在此处所做的那样:s[j++] = s[i];

解决方法是:

main() {
    char s1[] = "XALOMR";
    char s2[] = "EWRTOG";

    squeeze(s1, "AO");
    squeeze(s2, "RGV");
}

这将在堆栈上创建一个字符数组。

【讨论】:

    【解决方案2】:

    字符串文字是只读的。当您尝试更改它时,您会遇到错误。

    【讨论】:

      【解决方案3】:

      如果要修改这些变量,则需要创建它们。

      char var1[20] =  "XALOMR";
      squeeze(var1, "AO");
      

      【讨论】:

        【解决方案4】:

        当您尝试更改字符串文字时,可能会出错。

        真正发生的是代码的行为是未定义的。如果你很幸运,你会犯错。如果运气不好,代码会按预期工作,这使得错误很难找到。

        顺便说一句,您可以声明一个 char 数组,该数组从用于初始化它的字符串文字中获取其大小:

        char var1[] = "XALOMR"; /* sizeof var1 == 7 */
        

        【讨论】:

          猜你喜欢
          • 2018-06-03
          • 1970-01-01
          • 2020-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-12
          • 1970-01-01
          相关资源
          最近更新 更多