2016-11-04 7 views
0

Je fais mes premiers pas avec C (pointeurs, pointeur, etc, je l'aime), alors ayez pitié si c'est une question bête.C - pas de sortie après snprintf

Ce sorties fragment rien:

char buf[256]; 
snprintf(buf, sizeof buf, "output: %s%s%s"); 

puts("test"); 

Ce sorties fragment "test" (comme prévu):

char buf[256]; 
snprintf(buf, sizeof buf, "output: %s%s"); 

puts("test"); 

=>test 

Question: Quel rôle snprintf jouer ici? Existe-t-il une relation avec la déclaration puts ou pourquoi l'action n'a-t-elle aucun effet/résultat dans le premier code?

+2

Vos appels 'snprintf' sont des paramètres manquants - votre compilateur devrait vous avertir à ce sujet (en supposant que les avertissements du compilateur soient activés?). Vous pouvez choisir [l'un d'entre eux] (http://stackoverflow.com/q/562303/253056) et faire un peu de lecture. –

+1

De plus sprintf et snprintf n'impriment rien sur stdout, ils impriment sur un buffer (buf dans ton cas) – Marco

+0

utilise eclipse cdt. il n'y a aucun avertissement de compilateur apparaissant. Je vérifie maintenant si j'ai manqué un réglage quelque part –

Répondre

1

Parce que snprintf(buf, sizeof buf, "output: %s%s%s"); nécessite 3 paramètres:

snprintf(buf, sizeof buf, "output: %s%s%s", str1, str2, str3);

et snprintf(buf, sizeof buf, "output: %s%s"); nécessite 2 paramètres:

snprintf(buf, sizeof buf, "output: %s%s", str1, str2);

si vous ne passez pas de paramètres snprintf fonction ne signifie pas snprintf wont essayez d'y accéder. Ainsi, le résultat que vous voyez est un résultat de faute de segmentation causé par snprintf essayant d'accéder au paramètre "str3" qui n'existe pas.

+0

Merci, votre réponse semble plausible. Mais dans mes deux tests (réussis et inefficaces), il y a au moins deux paramètres manquants. Dans l'un d'entre eux, aucune erreur de segmentation ne se produit. Ce n'est pas un comportement prévisible du compilateur ou? Quoi qu'il en soit, j'accepterai votre réponse parce que je ne pense pas qu'il y ait une réponse raisonnable à ces questions lorsque les fonctions ne sont pas utilisées comme elles devraient être utilisées. –

+2

Un comportement imprévisible est exactement ce que vous devriez attendre d'une telle erreur. C'est ce qu'on appelle un comportement indéfini. – chqrlie

+0

C'est assez simple: quand snprintf essaie d'accéder aux deux premiers paramètres, ces paramètres résident dans la page existante (snprintf reçoit des indésirables, mais de la mémoire qui appartient à votre processus), mais essaye d'accéder au troisième paramètre. page qui n'appartient pas à votre processus ou n'existe pas et vous attraper la faute de segmentation. Les autres mots sur lesquels vous obtiendrez une erreur de segmentation dépendent des informations indésirables dans les pages de mémoire allouées (car snprintf recherche/0 = EOL). – nopasara