0
votes

Pourquoi Printf n'accepte pas un pointeur comme argument

Pourquoi CodeBlocks se bloque lorsque j'essaie d'exécuter ce code:

void main(void)
{
    char *ch= "Sam smith";
    printf("%s\n",ch);
}


5 commentaires

essayez "% c \ n" à la place


% c imprimera seulement un personnage


* CH 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 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 au minimum; Considérez également -WEPPETILLES-BOUNDS pour identifier d'autres erreurs courantes.


3 Réponses :


3
votes

* ch code> DERÉFERERCES EM> Le pointeur pour donner les données qu'il pointe. Ici le premier caractère de la chaîne.

fournissant le mauvais spécificateur à printf code> est un comportement non défini (transmettre une valeur où printf code> attend un pointeur) p>

const char *ch= "Sam smith";


0 commentaires

2
votes

Pourquoi CodeBlocks se bloque lorsque j'essaie d'exécuter ce code: P>

char *ch= "Sam smith";
printf("%s\n",*ch);

0 commentaires

0
votes

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.


Ainsi, xxx

est faux. * ch est le premier caractère de la chaîne, dans ce cas s , de type char mais le % s Le spécificateur de conversion attend un argument de type * char . xxx

est correct. ch est de type * char au besoin par le spécificateur de conversion % s .

donc, codeblocks " Crashes "apparemment à cause du type d'argument de désaccordement.


0 commentaires