Место записи нарушения доступа 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

scanf("%d", multiple);

должен быть:

scanf("%d", & multiple);

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

Ответ 2

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

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

Ответ 3

Измените

scanf("%d", multiple);

to

scanf("%d", &multiple);

Ответ 4

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

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

scanf("%d", &multiple);

Ответ 5

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

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

В ореховой оболочке переменная address-of указывается &.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.