2014-12-15 4 views
-2

Эта программа отлично компилируется. Когда я вводим номер, он падает на меня. name.exe has stopped working Но почему?Почему эта программа C сбой? Он скомпонован

int main (void) { 
    int arrayMax = 0; 

    printf ("How many numbers will be entered?\n"); 
    scanf ("%i", arrayMax); 

    int i; 
    double userInput [arrayMax]; 

    return 0; 
} 
+3

В C, что ваша программа правильно компилируется, это * никакой гарантии вообще *, что она также будет * работать * правильно! C дает вам большую силу, что означает, что легко сделать что-то «неправильное». – Carpetsmoker

+1

Вы предлагаете, чтобы программа «компиляции» также всегда работала хорошо? Возможно, C не подходит для вас! – AFract

+0

Цикл for закомментирован, потому что я пытался выяснить, почему он не работает. Я не мог найти точного ответа, поэтому я приехал сюда. –

ответ

3

Вы забыли поставить & оператор в scanf аргумента.

scanf ("%i", &arrayMax); 
      // ^Place unary & to specify the location. 
5
scanf ("%i", &arrayMax); 

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

+0

Это поможет рассказать OP * почему * это устраняет проблему, и почему выключение '&' off вызвало крах в первую очередь. –

1

scanf является variadic function.

Таким образом, компилятор не может определить, правилен ли тип каждого переданного ему аргумента (ожидайте для типа первого аргумента, который явно объявлен как const char*).

В результате решение «перемещается» от времени компиляции до времени выполнения, поэтому вместо ошибки времени компиляции вы можете получить ошибку во время выполнения.

Например, в случае scanf("%i") функция ожидает адрес переменной int.

В вашем коде вы передаете значение 0, поэтому scanf будет сначала сканировать пользовательский ввод, а затем попытаться записать его по этому адресу памяти.

Если сегмент памяти, содержащий этот адрес, не имеет Укажите разрешение доступа (например, если код кода вашей программы находится по этому адресу), то эта попытка приведет к нарушению доступа к памяти во время выполнения ,

Вы можете заставить его работать правильно, изменив scanf("%i",arrayMax) на scanf("%i",&arrayMax).