brice brice - 1 year ago 48
C Question

How to reverse a string in place in C using pointers?

Possible Duplicate:

How do you reverse a string in place in C or C++?

OK, I'm learning C, and I'm trying to reverse a string in place using pointers. (I know you can use an array; this is more about learning about pointers.)

I keep getting segmentation faults when trying to run the code below. GCC seems not to like the
*end = *begin;
line. Why is that?

Especially since my code is nearly identical to the non-evil C fn already discussed

#include <stdio.h>
#include <string.h>

void my_strrev(char* begin){
char temp;
char* end;
end = begin + strlen(begin) - 1;

temp = *end;
*end = *begin;
*begin = temp;

char *string = "foobar";
printf("%s", string);

Answer Source

One problem lies with the parameter you pass to the function:

char *string = "foobar";

This is a static string allocated in the read-only portion. When you try to overwrite it with

*end = *begin;

you'll get the segfault.

Try with

char string[] = "foobar";

and you should notice a difference.

The key point is that in the first case the string exists in the read-only segment and just a pointer to it is used while in the second case an array of chars with the proper size is reserved on the stack and the static string (which always exists) is copied into it. After that you're free to modify the content of the array.