This question already has an answer here:
I am trying to write an in-place reverse function and have followed online code pretty much exactly, yet running the following program throws a bus error. Am I passing the wrong kind of argument to reverse()?
void reverse(char *str) {
char * end = str;
char tmp;
if (str) {
while (*end) {
++end;
}
--end;
while (str < end) {
tmp = *str;
*str++ = *end;
*end-- = tmp;
}
}
}
int main() {
char *s = "sample";
reverse(s);
printf("%s\n");
return 1;
}
Your reverse function is perfectly correct. Just a few thing with your main function part:
as KarthikT said, s should be
char[]
notchar*
because changing literal is undefined.in your printf function, you forgot to put s as a parameter.
return 0
is successful.return 1
is error.So the new main should be like:
Output:
You might want to change
to
It is undefined behavior to try and modify the string literals, they should be used as
const char *
.Probably unrelated, but a suggestion,
When you do something like
*end--
, you might want to put paranthesis so that it does what you think it does.The above can be
or
And you need a good grasp of the precedence rules to be sure what you want is what is happening.
Here sample is stored in the read-only memory, so you can never make modifications on such literals.
In order to do manipulation, you have to store the literals in read-write memory. The below code can solve your problem.
Output:
To know what is happening, you have to understand the memory layout of a C program.
Here, you cannot modify the data. "
s
" is a pointer to achar const
("sample") and you are trying to modify thechar const
. That is why you are getting thebus error
error.UPDATE Below post is not related to your question. But if you know where are the memory allocated for all the variables in C, then you can code better. The below program gives a better understanding of the memory layout of a C Program. I have not included the command line arguments, function argument and return values of function in the diagram. People who want to update this post can add the command line arguments, function argument and return values of function to the diagram.