Pourquoi ce code produit-il une erreur de segmentation?

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:

  1. Dans tous les cas, une chaîne “mono” est placée dans la section de code du programme.

  2. Dans le dernier exemple, le contenu de cette chaîne est copié dans le tableau str .

  3. 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.