Pasando el puntero char como argumento para funcionar

Este progtwig imprime diferentes permutaciones de una cadena. Funciona correctamente si declaro una cadena como matriz char en main y pasa el nombre de la matriz en la función printAnagram. . ¿Por qué?

#include  #include  void printAnagram(char *str, int b, int e); int main() { char *s = "ABC"; // works fine when char s[] = "ABC" is used. printAnagram(s, 0, 2); return 0; } void swap(char *a, char* b) { char temp = *a; *a = *b; *b = temp; } void printAnagram(char *str, int b, int e) { int i = 0; if(b==e) printf("%s\n", str); else { for(i=b;i<=e;i++) { swap((str+b),(str+i)); printAnagram(str, b+1, e); swap((str+b), (str+i)); } } } 

En char *s = "ABC";"ABC" es una cadena que lo modifica literalmente es UB.

Los punteros generalmente se usan para señalar datos que ya existen, por lo que puede usarlos así

 char arr[] = "C__"; char* t = &arr[0]; 

También modificable,

 t[1] = 'p'; t[2] = 'p'; 

aquí

 char *t= "C__"; 

apunta a una constante de cadena .

Hay una mejor manera de escribir lo anterior:

 const char* t= "C__"; 

El locking tiene que ver con el tipo de memoria donde se almacenan los caracteres de la cadena, no con la statement o no como una matriz de caracteres o un puntero. En otras palabras, puede mantener el puntero y copiar la cadena en él, de esta manera:

 int main() { char *s = strdup("ABC"); printAnagram(s, 0, 2); free(s); return 0; } 

El estándar C considera que la memoria asignada a literales de cadena, como "ABC" , no se puede escribir. Por lo tanto, cualquier cambio que les hagas causará un comportamiento indefinido. Cuando cambia la statement a una matriz, C copia el literal en la memoria grabable, por lo que no hay un comportamiento indefinido (y no hay locking).

char *s = "ABC"; es un literal de cadena almacenado en read only memory ubicación de read only memory . Cuando intentes modificarlo, sí se bloqueará. De hecho es de const char *s . En su lugar, debe utilizar como se menciona ya como,

 char s[] = "ABC"; 

Mira esta respuesta SO anterior Modificando una cadena literal .

Usted está accediendo a la memoria de sólo lectura.

 char *a="ABC";// It will stored in the read only memory. 

Si estás intentando acceder a esto no puedes hacerlo. Puedes usarlo así.

 char array[]="ABC"; char *a=array; 

Puede intentar declarar una matriz char, por ejemplo char [6] str="ABC"; y luego use un puntero char, para administrar esa matriz: char *p=&str; El locking se debe al hecho de que su puntero a una cadena que no está presente en la memoria de la stack.