'to_upper program does not compile due to bus error in C
I have a simple function that should convert lowercase characters to uppercase. But at a certain point, I get a bus error. What does this error mean and how can it be fixed?
PS I've been trying to figure out what this error means for a long time and as a result I can't figure out what the difference is between bus error and segmentation fault
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"));
Solution 1:[1]
See this question for an answer to "how does a bus error differ from a segmentation violation".
As to why you're getting a bus error in your case, you're effectively modifying a string literal, as Some programmer dude said in a comment on your OP. Here's why:
- You call your function with "TeSt" as an argument.
- The function parameter
strgets assigned the location of the string literal "TeSt", which is located in in unmodifiable region of your program. - You say
char *strCopy = (char *) str, which is saying thatstrCopyshould point to the same location asstr. If you want to actually copy the string, usestrdup(str)instead. - When you say
strCopy[i] = ..., because of the above, this is trying to change values in a memory region you don't have access to. That's why you get a bus error.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | fireshadow52 |
