En fin de compte, il serait plus propre de le renverser en place, comme ceci:
#include <stdio.h>
#include <string.h>
void
reverse(char *s)
{
int a, b, c;
for (b = 0, c = strlen(s) - 1; b < c; b++, c--) {
a = s[b];
s[b] = s[c];
s[c] = a;
}
return;
}
int main(void)
{
char string[] = "hello";
printf("%s\n", string);
reverse(string);
printf("%s\n", string);
return 0;
}
Votre solution est essentiellement une version sémantiquement plus grande de celle-ci. Comprendre la différence entre un pointeur et un tableau. La norme stipule explicitement que le comportement d'une telle opération (modification du contenu d'un littéral de chaîne) n'est pas défini. Vous devriez également voir un extrait this de eskimo:
Lorsque vous initialisez un tableau de caractères avec une constante chaîne:
char string[] = "Hello, world!";
vous vous retrouvez avec un tableau contenant la chaîne, et vous pouvez modifier le contenu du tableau à votre cœur joie:
string[0] = 'J';
Cependant, il est possible d'utiliser des constantes de chaîne (le terme officiel est littéraux de chaîne) à d'autres endroits dans votre code. Comme ce sont des tableaux, le compilateur génère des pointeurs sur leurs premiers éléments lorsqu'ils sont utilisés dans les expressions, comme d'habitude. Autrement dit, si vous dites
char *p1 = "Hello";
int len = strlen("world");
il est presque comme si vous avait dit
char internal_string_1[] = "Hello";
char internal_string_2[] = "world";
char *p1 = &internal_string_1[0];
int len = strlen(&internal_string_2[0]);
Ici, les tableaux nommés internal_string_1 et internal_string_2 sont censés suggérer le fait que le compilateur génère effectivement peu temporaire tableaux chaque fois que vous utilisez une constante de chaîne dans votre code. Cependant, le fait subtil est que les tableaux qui sont `` derrière '' les constantes de chaîne ne sont pas nécessairement modifiables. En particulier, le compilateur peut les stocker en lecture seule. Par conséquent, si vous écrivez
char *p3 = "Hello, world!";
p3[0] = 'J';
votre programme peut se bloquer, car il peut essayer de stocker une valeur (dans ce cas, le caractère « J ») dans la mémoire non inscriptible.
La morale est que chaque fois que vous construisez ou de modifier les chaînes, vous devez vous assurer que la mémoire vous construisez ou les modifier en est inscriptible.Cette mémoire doit être soit un tableau que vous avez alloué, soit de la mémoire que vous avez dynamiquement allouée par les techniques que nous verrons dans le chapitre suivant. Assurez-vous qu'aucune partie de votre programme n'essaiera jamais de modifier une chaîne qui est en fait l'un des tableaux non nommés et non-éditables que le compilateur a générés pour vous en réponse à l'une de vos constantes de chaîne. (La seule exception est l'initialisation du tableau, car si vous écrivez dans un tableau, vous écrivez dans le tableau, pas dans le littéral que vous avez utilisé pour initialiser le tableau.) "
Même si les gens répondre à votre question figured it out, on ne dit quelle erreur vous obtenez, ou ce qui ne fonctionnait pas ! Vous devez toujours décrire ce que vous attendiez et ce que vous avez réellement vu (sortie incorrecte? Erreur de seg/erreur GPF? Boucle infinie/se bloquer?) – abelenky
C'était une erreur de segmentation. J'aurais dû le mentionner, merci pour le rappel. – qwer