Sur la ligne 18, je reçois une erreur de segmentation lors de la première itération (i = 0).
#include int main(void) { char* str = "mono"; int length = 0; int i; for (i = 0; ; i++) { if (str[i] == '\0') { break; } else { length++; } } for (i = 0; i < length / 2; i++) { char temp = str[length - i - 1]; str[length - i - 1] = str[i]; // line 18 str[i] = temp; } printf("%s", str); return 0; }
J’ai écrit cet algorithme pour inverser une chaîne.
Vous modifiez un littéral de chaîne:
char* str = "mono";
et les littéraux de chaîne ne sont pas modifiables en C.
Pour résoudre votre problème, utilisez un tableau initialisé par le littéral chaîne:
char str[] = "mono";
Erreur d’exécution:
char* str = "mono"; // str points to an address in the code-section, which is a Read-Only section str[1] = 'x'; // Illegal memory access violation
Erreur de compilation:
const char* str = "mono"; // This is a correct declaration, which will prevent the runtime error above str[1] = 'x'; // The comstackr will not allow this
Tout bon:
char str[] = "mono"; // str points to an address in the stack or the data-section, which are both Read-Write sections str[1] = 'x'; // Works OK
Remarques:
Dans tous les cas, une chaîne “mono” est placée dans la section de code du programme.
Dans le dernier exemple, le contenu de cette chaîne est copié dans le tableau str
.
Dans le dernier exemple, le tableau str
est situé dans la stack si str
est une variable locale non statique, sinon dans la section data du programme.