2010-01-29 15 views
11

Estoy intentando leer la entrada desde un teclado que voy a utilizar para crear un conjunto de multiplicaciones. Si codifico el entero para usar, el programa funciona bien, sin embargo, cuando dejo que el usuario ingrese su propio número, el programa falla y muestra un error sobre una violación de acceso.Ubicación de escritura de violación de acceso 0x00000000. int lectura desde el teclado

estoy seguro de que esto es algo simple pero como soy bastante nuevo en C que no estoy del todo seguro de todos los principios a seguir cuando se utiliza el lenguaje.

#include <stdio.h> 
#include <string.h> 
#include <math.h> 

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."); 
} 

Nota: He definido el valor inicial de múltiples a 0 en caso contrario me encuentro un error al intentar utilizar un valor no inicializado.

+1

Buena pregunta inicial de C. +1. –

+0

+1 de mí, ya que es un obstáculo temprano al usar scanf al aprender C. – t0mm13b

Respuesta

18
scanf("%d", multiple); 

debería ser:

scanf("%d", & multiple); 

En otras palabras, es necesario dar scanf un puntero a lo que desea leer en. Este es un error clásico en el uso de scanf(), y uno cada uno hace de vez en cuando, así que recuerde esto para la próxima vez que haces :-)

+0

Excelente, gracias. –

6

Cambio

scanf("%d", multiple); 

a

scanf("%d", &multiple); 
6

scanf espera un puntero a la variable a establecer.

La forma correcta es

scanf("%d", &multiple); 
16

Sólo para explicar por qué esto ocurrió (como Neil ya se ha explicado lo que estaba causando), scanf esperaba una dirección a escribir. Cuando se aprobó en la valor de 'múltiple', que fue interpretado como una dirección, tratar específicamente 0 ya que era el valor en el momento.

La razón de esto es para que scanf puede establecer el valor de la variable con el valor de la entrada. Si no pasa un puntero, está pasando una copia del valor de la variable. Cuando se pasa un puntero que está pasando una copia del valor del puntero , así que mientras scanf escribe a la misma dirección de memoria que puede cambiar el valor de la variable.

+0

Gracias por la explicación, he votado su respuesta. –

4

No está pasando la dirección de variable para múltiple para almacenar el resultado de scanf por lo tanto, el requisito de scanf("%d", &multiple);.

Esto indica el tiempo de ejecución, para leer un número entero y colocarlo en la dirección de la variable, por lo tanto, se debe utilizar &. Sin él, tiene un error de tiempo de ejecución ya que está pasando el valor de la variable, pero el tiempo de ejecución no sabe qué hacer con él.

En una cáscara de nuez, una dirección - variable está indicada por &.

Espero que esto ayude, Saludos cordiales, Tom.

+0

Gracias por la explicación detallada, he votado su respuesta –

Cuestiones relacionadas