2010-01-29 2 views
11

Я пытаюсь прочитать ввод с клавиатуры, которую я буду использовать для создания набора умножений. Если я жестко кодирует целое число, то программа отлично работает, когда я позволяю пользователю вводить свой номер, сбой программы и показывает ошибку о нарушении доступа.Доступ к месту нарушения прав доступа 0x00000000. чтение int с клавиатуры

Я уверен, что это что-то простое, но поскольку я довольно новичок в C, я не совсем уверен в всех принципах, которые следует придерживаться при использовании языка.

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

Примечания: Я установить начальное значение кратного 0 в противном случае возникает ошибку при попытке использовать неиницализированное значение.

+1

Хорошо ранний вопрос C. +1. –

+0

+1 от меня, поскольку это ранний камень преткновения при использовании scanf при обучении C. – t0mm13b

ответ

18
scanf("%d", multiple); 

должно быть:

scanf("%d", & multiple); 

Другими словами, вам нужно дать зсапЕ указатель на вещь, которую вы хотите прочитать в. Это классическая ошибка в использовании зсапЕ(), и один каждый делает время от времени, так что помните об этом в следующий раз вы сделать :-)

+0

Отлично, спасибо. –

6

Изменить

scanf("%d", multiple); 

в

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

scanf ожидает указатель на переменную, которую нужно установить.

Правильная форма

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

Просто объяснить, почему это произошло (как Нил уже объяснил, что причиной его), зсапЕ ожидал адрес для записи. Когда вы передали значение «multiple», оно было интерпретировано как адрес, в частности адрес 0, поскольку это значение было тогда.

Причина этого в том, что scanf может установить значение вашей переменной на значение ввода. Если вы не передадите указатель, вы передадите копию значения переменной. Когда вы передаете указатель, вы передаете копию значения указатель, так как scanf записывает на тот же адрес памяти, он может изменить значение переменной.

+0

Спасибо за объяснение, я подтвердил ваш ответ. –

4

Вы не передаете адрес переменной для нескольких, чтобы сохранить результат от scanf, следовательно, требование для scanf("%d", &multiple);.

Это сообщение времени выполнения, чтобы прочитать целое число и поместить его в адрес переменной, поэтому & необходимо использовать. Без этого у вас есть ошибка времени выполнения, поскольку вы передаете значение переменной, но среда выполнения не знает, что с ней делать.

В гайке-ракете адрес- переменная указана &.

Надеюсь, это поможет, С уважением, Tom.

+0

Спасибо за подробное объяснение, я проголосовал за ваш ответ –

Смежные вопросы