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 的评论中所说的那样。原因如下:
- 您使用“TeSt”作为参数调用您的函数。
- 函数参数
str
被分配了字符串文字“TeSt”的位置,它位于程序的不可修改区域。
- 你说
char *strCopy = (char *) str
,意思是 strCopy
应该指向与 str
相同的位置。如果您想实际复制字符串,请改用 strdup(str)
。
- 当您说
strCopy[i] = ...
时,由于上述原因,这是在尝试更改您无权访问的内存区域中的值。这就是您收到总线错误的原因。
我有一个简单的函数可以将小写字符转换为大写。但是在某个时候,我收到了总线错误。 这个错误是什么意思,如何解决?
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 的评论中所说的那样。原因如下:
- 您使用“TeSt”作为参数调用您的函数。
- 函数参数
str
被分配了字符串文字“TeSt”的位置,它位于程序的不可修改区域。 - 你说
char *strCopy = (char *) str
,意思是strCopy
应该指向与str
相同的位置。如果您想实际复制字符串,请改用strdup(str)
。 - 当您说
strCopy[i] = ...
时,由于上述原因,这是在尝试更改您无权访问的内存区域中的值。这就是您收到总线错误的原因。