6
votes

Défaut de segmentation Inverser une chaîne littéral

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

2 commentaires

Peut-être un titre différent? Bien que l'exemple soit du code pour inverser une chaîne, la question réelle concerne la modification des matrices et des littéraux de chaîne.


Avez-vous une raison pour laquelle vous n'utilisez pas strIV () ? De plus, cela se brisera avec des caractères multi-octets.


4 Réponses :


15
votes

Votre code tente de modifier un littéral à chaîne qui n'est pas autorisé dans C ou C ++ si vous modifiez: xxx

à: xxx p > Ensuite, vous modifiez le contenu de la matrice, dans lequel le littéral a été copié (équivalent à l'initialisation de la matrice avec des caractères individuels), ce qui est correct.


0 commentaires

5
votes

Si vous faites Char S [6] = {'H', 'E', 'L', 'L', 'O', '\ 0'}; vous mettez 6 < Code> Char S dans un tableau sur la pile. Lorsque vous faites char * s = "bonjour"; Il n'y a qu'un pointeur sur la pile et la mémoire qu'il pointe pour peut-être être en lecture seule. L'écriture sur cette mémoire provoque un comportement non défini.


0 commentaires

0
votes

Avec certaines versions de GCC, vous pouvez autoriser la modification de chaînes statiques avec des chaînes de fibres. Pas qu'il y ait vraiment une bonne excuse pour le faire.


0 commentaires

0
votes

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];
    }
}


0 commentaires