Это:
scanf("%d",a[i]);
неправильно. Формат %d
спецификатор требует указатель туда, где значение должно быть сохранено после преобразования, то есть он должен быть:
scanf("%d", &a[i]);
Это необходимо, так как в противном случае вы передаете значение a[i]
к scanf()
, не давая ему никакой возможности изменение значение. Передавая адрес значения, scanf()
может просто записать на указанный адрес памяти, чтобы изменить значение, которое там хранится. С printf()
вы не хотите, чтобы ваши значения менялись, поэтому передача их непосредственно в printf()
в порядке.
Кроме того, преобразование (как и многие другие формы I/O) может потерпеть неудачу, поэтому вы должны проверить возвращаемое значение, прежде чем полагаться на преобразование преуспев:
if(scanf("%d", &a[i]) == 1)
printf("%d\n", a[i]);
Вы, вероятно, следует прочитать the manual page for scanf()
еще пару раз. :)
Пожалуйста, не используйте библиотечные функции, такие как 'scanf' и' printf', не зная его основного использования. Прочтите страницу руководства здесь http://linux.die.net/man/3/scanf. – VoidPointer
@VoidPointer Это очень хороший комментарий, но я тоже спрашиваю вас. Да, scanf требует указатель, но то, что происходит, когда у него нет, - это мой вопрос. И, кроме того, я столкнулся с ошибкой сегментации. что в этом контексте?] – Mani
Упомяните об этом в вопросе ясно. Аргументы 'scanf', указанные после спецификатора формата, рассматриваются и интерпретируются как ** указатели **. Поведение ** не определено **, когда после первого аргумента отправляются аргументы, отличные от значения типа integer 'a [i]'. – VoidPointer