Lo que está mal con el código de abajo

Se suponía que el código giraba un vector unidimensional de n elementos dejados por la posición i. por ejemplo, con n = 8 yi = 3, el vector abcdefgh se rota a defghabc.

El siguiente se bloquea en la función string_reverse. No pude averiguar lo que está mal allí.

#include  #include  #include  void string_reverse(char* str, int left, int right ) { char *p1 = str + left; char *p2 = str + right; while (p1 < p2) { char temp = *p1; *p1 = *p2; *p2 = temp; p1++; p2--; } } void rotate( char* str, int k ) { int n = strlen( str ); string_reverse( str, 0, k - 1 ); string_reverse( str, k, n - 1 ); string_reverse( str, 0, n -1 ); } int main(int argc, char* argv[]) { char* string = "abcdefghijk"; rotate( string, 3 ); printf("%s",string ); getch(); return 0; } it crashes at *p1 = *p2; 

Cambio

 char* string = "abcdefghijk"; 

a

 char string[] = "abcdefghijk" 

El primero apunta a un literal de cadena de solo lectura, mientras que el último es una matriz inicializada desde ese literal.

Si desea utilizar una cadena para manipular, use una matriz de caracteres real en lugar de un puntero de carácter.

  char string[] = "abcdefghijk"; 

Memoria asignada como inicializador variable, como esta …

 char* string = "abcdefghijk"; 

… es inmutable. Es decir, no puede cambiarlo y los bashs de escribir en él darán como resultado un error de seguridad. Solo puede modificar la memoria asignada a través de malloc() y amigos. Puedes lograr esto muy fácilmente con tu cadena estática como esta:

 char *string = strdup("abcdefghijk"); 

La función strdup() llama a malloc() internamente y luego copia la cadena de origen en el destino. Ya estás #include -ing string.h , por lo que el prototipo de la función strdup() ya está disponible sin ningún código adicional.