0
votes

Pourquoi le programme C suivant C donne une erreur de segmentation?

J'ai essayé de fonctionner après le programme C et obtenu Défaut de segmentation , je ne reçois pas l'endroit où le code est faux, la sortie indique le programme terminé avec le code de sortie 139 . xxx


2 commentaires

* A [0] est un char . % s nécessite un char * . Vous voulez probablement juste a [0] .


Aussi, passez en revue les avertissements du compilateur. Devrait obtenir quelque chose comme: Avertissement: le format '% s' s'attend à ce que l'argument de type 'char *', mais l'argument 2 a le type 'int' [-wormat =]


5 Réponses :


1
votes

L'expression a [0] code> a le type char * code> en raison de la déclaration du tableau A code>.

printf("\n S==>>> %s", *a );


0 commentaires

1
votes

Tout d'abord le code d'approche correct: xxx

second, vous stockez la chaîne "S1" dans un [0] et une chaîne "S2" dans un [1]. Donc, si vous voulez imprimer la chaîne, ce serait comme ci-dessus.

Si vous essayez d'ajouter * ou et avant le pointeur, cela indiquerait l'adresse du pointeur et pour l'impression de l'adresse% D est utilisé. Maintenant, en cas de code incorrectement, il montrera certainement une erreur


0 commentaires

1
votes

la ligne

printf ("\ n s == >>>% s", * a [0]);

est faux.

Vous pouvez écrire soit * A ou A [0] (les deux sont équivalents), mais * a [0] est équivalent à a [0] [0] , qui est juste un caractère, c'est-à-dire un seul caractère. Puisque vous avez spécifié que vous imprimez une chaîne dans votre chaîne de format Imprimerf , vous devez spécifier une chaîne, c'est-à-dire un tableau de caractères terminé NULL, au lieu d'un seul caractère.

Si vous souhaitez imprimer un seul caractère au lieu d'une chaîne entière, vous devez spécifier % c dans la chaîne de format au lieu de % s < / code>.


0 commentaires

2
votes
 printf("\n S==>>> %s",a[0]); // a[0] is of type char *

0 commentaires

1
votes

Alors que toutes les autres réponses ont raison sur la bonne utilisation, je veux expliquer davantage pourquoi vous obtenez exactement une erreur de segmentation.

Le code xxx

essaie d'imprimer La chaîne \ n s == >>> S1 mais échoue surtout avec une défaillance de segmentation, car l'accès de * A [0] entraîne l'adresse 0x73 car la valeur hexagonale du s est 0x73 . Et l'adresse 0x73 n'est pas mappée dans l'espace d'adressage de votre processus, conduisant ainsi à un défaut de segmentation car vous essayez essentiellement d'imprimer une chaîne à l'adresse 0x73 .


0 commentaires