2013-03-19 3 views
0

Я изучаю массив и просто написал эту небольшую программу, чтобы увидеть, как она работает. но его сбой с сегментацией faul, который я понимаю, означает, что я пишу свою переменную/функцию в место памяти, которое ему не выделено. Но я не могу понять, как это сделать. Может ли кто-нибудь сообщить мне, пожалуйста? Я вызываю introArray из моего main().Сбой программы Array с ошибкой сегментации

int introArray (void) 
{ 
    int total, ctr; 

    printf("enter how many students \n"); 
    scanf("%d", &total); 

    int students[total]; 
    ctr = 0; 

    while (students[ctr] <= total) 
    { 
     printf("enter student %d DOB in mmddyy \n", ctr); 
     scanf("%d", students[ctr]); 
     ctr++; 
    } 

    return 0; 

}

+0

Какой компилятор вы используете для создания этой программы? – Ganesh

ответ

0

ctr выходит за рамки total. Таким образом, вы выходите из связанного Изменение цикла к

while (ctr < total) 
{ 
     printf("enter student %d DOB in mmddyy \n", ctr); 
     scanf("%d", &(students[ctr])); 
     ctr++; 
} 
0

Эта линия

while (students[ctr] <= total) 

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

while (ctr < total) 

вам необходимо строгое неравенство, как индексы массива равны нулю на основе.

Кроме того, ваш scanf вызов внутри вашего цикла while неверен - вторым аргументом должен быть указатель, и в настоящее время вы передаете целое число. Он должен быть

scanf("%d", &students[ctr]); 
0

Я думаю

scanf("%d", students[ctr]); 

должен быть

scanf("%d", &students[ctr]); 
+1

@Armin Только второй справа. В первом фрагменте scanf попытается написать в адресных учениках [ctr], что является некоторым значением мусора (или, может быть, нулевым, в зависимости от компилятора). Во втором фрагменте scanf будет писать по адресу элемента ctr из массива студентов, что является правильным. –

+0

@AaronGolden Tnx, я не знаю почему я видел% s там. Я удалил комментарий ... – 2013-03-19 22:59:36

2

В коде есть одна логика реализации проблемы. Общее число студентов total и, следовательно, ваш while цикл должен быть

while(ctr < total) 

Данные, которые должны быть прочитаны также должны scanf("%d", &students[ctr]); Существует амперсанд отсутствует

+0

спасибо ganesh. Я сделал рекомендуемые изменения и его по-прежнему сбой с той же ошибкой сбоя в сегрегации. Любая идея, почему ??? Кроме того, почему амперсанд нужен, когда я разыгрываю с помощью [] ?? – user2152138

+0

@ user2152138 Если вы не использовали _ampersand_, тогда есть вероятность, что ваш код сработает. Когда вы разыскиваете элемент массива как 'students [ctr]', тогда вы фактически получаете доступ к соответствующему значению. Однако ваша цель - прочитать значение через 'scanf', и для этого вам нужно передать« адрес »элемента. Следовательно, вы должны использовать '& students [ctr]'. – Ganesh

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