to_upper 由于 C 中的总线错误,程序无法编译

to_upper program does not compile due to bus error in C

我有一个简单的函数可以将小写字符转换为大写。但是在某个时候,我收到了总线错误。 这个错误是什么意思,如何解决?

PS 很长一段时间以来,我一直在试图弄清楚这个错误的含义,结果我无法弄清楚 bus error 分段错误

void *to_upper(const char *str) {
    char *strCopy = (char *)str;

    int strLength = strlen(strCopy);

    for (int i = 0; i < strLength; i++) {
        if (strCopy[i] >= 'a' && strCopy[i] <= 'z') {
            strCopy[i] = (int)strCopy[i] - 32; // ERROR -> zsh: bus error  ./a.out
        }
    }

    return strCopy;
}
printf("to_upper: %s", (char *)to_upper("TeSt"));

请参阅 this question 以了解“总线错误与分段违规有何不同”的答案。

至于为什么在您的案例中出现总线错误,您实际上是在修改字符串文字,正如一些程序员老兄在对您的 OP 的评论中所说的那样。原因如下:

  1. 您使用“TeSt”作为参数调用您的函数。
  2. 函数参数 str 被分配了字符串文字“TeSt”的位置,它位于程序的不可修改区域。
  3. 你说 char *strCopy = (char *) str,意思是 strCopy 应该指向与 str 相同的位置。如果您想实际复制字符串,请改用 strdup(str)
  4. 当您说 strCopy[i] = ... 时,由于上述原因,这是在尝试更改您无权访问的内存区域中的值。这就是您收到总线错误的原因。