0
votes

Que se passe-t-il si je passe une valeur variable au lieu d'une référence variable dans Scanf?

J'ai ce code: xxx

qui fonctionne parfaitement bien, mais je me demandais ce qui se passerait si je passe la valeur variable au lieu de la référence variable dans scanf Comme scanf ("% d", a) .

Je ne reçois pas d'erreur du compilateur mais il n'y a pas de sortie non plus. Qu'est-ce qui se passe ici?


3 commentaires

Longue histoire courte: UB


Si vous n'obtenez pas de message d'erreur ou d'avertissement de votre compilateur, votre compilateur est défectueux. Assurez-vous que les avertissements sont allumés dans votre compilateur.


Vous espéreriez un crash dur (Segfault). Mais puisque la variable n'est pas initialisée, il y a une cote décente qu'il contient une valeur de pointeur laissée par un appel de fonction précédent. Maintenant, il ne s'écrasera pas mais de la mémoire corrompue silencieusement, très difficile à diagnostiquer.


3 Réponses :


0
votes

dans scanf "% d" attend un pointeur sur int signifie un pointeur sur l'adresse de la variable où la valeur sera stockée, si vous passez A Vous allez simplement passer int Il n'y a aucun moyen que la valeur puisse être stockée car scanf ne saura pas où.

faire cela invoquera comportement non défini .


0 commentaires

0
votes

Fondamentalement, le & est un opérateur qui renvoie l'adresse de l'opérande. Si vous donnez dans Scanf la variable A sans le &, il sera transmis à la valeur de la valeur, ce qui signifie que Scanf ne sera pas en mesure de définir sa valeur pour que vous puissiez voir. En passant par-référence par référence - en utilisant et passe en fait un pointeur sur A - permet à Scanf de la définir.


1 commentaires

Le terme par référence n'existe pas dans le langage C. Les références sont une chose C ++. En C il n'y a que des pointeurs.



0
votes

scanf attend l'argument correspondant au spécificateur de conversion % d pour être l'adresse d'un objet int objet (avec type int * ). Quoi que ce soit A contient une adresse 1 .

Le comportement en faisant cela est indéfini - le compilateur n'est pas tenu de délivrer un diagnostic lors de la traduction et que l'environnement d'exécution n'est pas nécessaire de lancer une certaine exception. Selon la valeur contenue dans A , vous pouvez obtenir une erreur d'exécution ou vous pouvez encombrer un autre objet de données, ou votre code peut fonctionner sans aucune erreur apparente, ni quelque chose de complètement différent peut arriver.


  1. au moins sur les systèmes où tailleof (int) == taille de (int *) - pour un système tel que x86_64, ce n'est pas le cas, donc scanaf traitera des octets extérieur de A dans le cadre d'une adresse.


0 commentaires