Emplacement d’écriture de violation d’access 0x00000000. lecture int du clavier

J’essaie de lire l’entrée d’un clavier que je vais utiliser pour créer un ensemble de multiplications. Si je code le nombre entier à utiliser, le programme fonctionne correctement, mais lorsque je laisse l’utilisateur saisir son propre numéro, le programme se bloque et affiche une erreur concernant une violation d’access.

Je suis sûr que c’est quelque chose de simple, mais comme je suis assez nouveau en C, je ne suis pas tout à fait sûr de tous les principes à suivre lors de l’utilisation de la langue.

#include  #include  #include  void main() { int multiple = 0; int i; int answer; printf("Enter the multiple you wish to use..."); scanf("%d", multiple); printf("The multiplication table for %d is", multiple); for(i = 1; i <= 10; i++) { answer = i * multiple; printf("%d X %d = %d",i,multiple,answer); printf("\n"); } printf("Process completed."); } 

Remarque: je règle la valeur initiale de multiple sur 0, sinon je rencontre une erreur lorsque j’essaie d’utiliser une valeur non initialisée.

 scanf("%d", multiple); 

devrait être:

 scanf("%d", & multiple); 

En d’autres termes, vous devez donner à scanf un pointeur sur l’élément que vous souhaitez lire. Ceci est une erreur classique dans l’utilisation de scanf (), et que tout le monde fait de temps en temps, alors souvenez-vous-en pour la prochaine fois 🙂

Juste pour expliquer pourquoi cela est arrivé (comme Neil a déjà expliqué ce qui le causait), scanf attendait une adresse pour écrire. Lorsque vous transmettiez la valeur ‘multiple’, elle était interprétée comme une adresse, plus précisément l’adresse 0 car il s’agissait de la valeur à l’époque.

La raison en est que scanf peut définir la valeur de votre variable sur la valeur de l’entrée. Si vous ne passez pas de pointeur, vous transmettez une copie de la valeur de la variable. Lorsque vous passez un pointeur, vous transmettez une copie de la valeur du pointeur . Ainsi, tant que scanf écrit sur la même adresse mémoire, il peut modifier la valeur de la variable.

Changement

 scanf("%d", multiple); 

à

 scanf("%d", &multiple); 

scanf attend un pointeur sur la variable à définir.

La forme correcte est

 scanf("%d", &multiple); 

Vous ne transmettez pas l’adresse de variable multiple pour stocker le résultat de scanf où la nécessité de scanf("%d", &multiple); .

Cela indique au moteur d’exécution de lire un entier et de le placer dans la variable address-of , & doit donc être utilisé. Sans cela, vous obtenez une erreur d’exécution lorsque vous transmettez la valeur de la variable, mais le moteur d’exécution ne sait pas quoi en faire.

Dans un écrou, une adresse de variable est indiquée par & .

J’espère que cela vous aidera, Cordialement, Tom.