Pourquoi CodeBlocks se bloque lorsque j'essaie d'exécuter ce code:
void main(void) { char *ch= "Sam smith"; printf("%s\n",ch); }
3 Réponses :
fournissant le mauvais spécificateur à * ch code> DERÉFERERCES EM> Le pointeur pour donner les données qu'il pointe. Ici le premier caractère de la chaîne.
printf code> est un comportement non défini (transmettre une valeur où
printf code> attend un pointeur) p>
const char *ch= "Sam smith";
Pourquoi CodeBlocks se bloque lorsque j'essaie d'exécuter ce code: P>
char *ch= "Sam smith"; printf("%s\n",*ch);
in c, vous ne drégérez pas un pointeur sur une chaîne, lorsque vous souhaitez utiliser la chaîne entière, le pointeur pointe. Ce processus de déséroférence entraînerait le premier caractère de la chaîne respective, ce qui n'est pas ce que vous voulez.
En outre, il est comportement non défini si un spécificateur de conversion ne correspond pas à au type de l'argument relatif. p>
Ainsi, p> est faux. est correct. donc, codeblocks " Crashes em> "apparemment à cause du type d'argument de désaccordement. p> p> * ch code> est le premier caractère de la chaîne, dans ce cas
s code>, de type
char code> mais le
% s code> Le spécificateur de conversion attend un argument de type
* char code>. p>
ch code> est de type
* char code> au besoin par le spécificateur de conversion
% s code>. p>
essayez
"% c \ n" code> à la place
% c imprimera seulement un personnage
* CH code> n'est pas un pointeur, il s'agit du premier élément de la chaîne, d'un seul caractère.
Si vous ne fournissez que 1 caractère, pourquoi devrait-il imprimer plus? Comment
printf code> peut-il même savoir qu'il y a une chaîne avec plus de caractères à imprimer?
On dirait que vous avez oublié de activer un bon ensemble d'avertissements. Pour GCC, je recommande
-wall -wextra code> au minimum; Considérez également
-WEPPETILLES-BOUNDS CODE> pour identifier d'autres erreurs courantes.