Erreur de segmentation inversant un littéral de chaîne

#include  #include  int main(void) { //char s[6] = {'h','e','l','l','o','\0'}; char *s = "hello"; int i=0,m; char temp; int n = strlen(s); //s[n] = '\0'; while (i<(n/2)) { temp = *(s+i); //uses the null character as the temporary storage. *(s+i) = *(s+ni-1); *(s+ni-1) = temp; i++; } printf("rev string = %s\n",s); system("PAUSE"); return 0; } 

Sur la compilation, l’erreur est une erreur de segmentation (violation d’access). S’il vous plaît dites quelle est la différence entre les deux définitions:

 char s[6] = {'h','e','l','l','o','\0'}; char *s = "hello"; 

Votre code tente de modifier un littéral de chaîne, ce qui n’est pas autorisé en C ou C ++. Si vous modifiez:

 char *s = "hello"; 

à:

 char s[] = "hello"; 

vous modifiez ensuite le contenu du tableau dans lequel le littéral a été copié (ce qui revient à initialiser le tableau avec des caractères individuels), ce qui est OK.

Si vous faites char s[6] = {'h','e','l','l','o','\0'}; vous mettez 6 caractères dans un tableau sur la stack. Quand vous faites char *s = "hello"; il n’y a qu’un pointeur sur la stack et la mémoire sur laquelle elle pointe peut être en lecture seule. Ecrire dans cette mémoire provoque un comportement indéfini.

Avec certaines versions de gcc, vous pouvez autoriser la modification de chaînes statiques avec -fwritable-ssortingngs. Non pas qu’il y ait vraiment une bonne excuse pour le faire.

Vous pouvez essayer ceci:

 void strrev(char *in, char *out, int len){ int i; for(i = 0; i < len; i++){ out[len - i - 1] = in[i]; } } 

Notez qu'il ne traite pas du terminateur de chaîne.