Положение о нарушении прав доступа 0x00000000. чтение int с клавиатуры - PullRequest
11 голосов
/ 29 января 2010

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

Я уверен, что это что-то простое, но, поскольку я довольно плохо знаком с 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, в противном случае при попытке использования неинициализированного значения возникает ошибка.

Ответы [ 5 ]

18 голосов
/ 29 января 2010
scanf("%d", multiple);

должно быть:

scanf("%d", & multiple);

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

16 голосов
/ 29 января 2010

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

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

6 голосов
/ 29 января 2010

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

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

scanf("%d", &multiple);
6 голосов
/ 29 января 2010

Изменение

scanf("%d", multiple);

до

scanf("%d", &multiple);
4 голосов
/ 29 января 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...