2013-06-18 2 views
-1

Что происходит со следующим кодом, написанным на языке c? У меня возникла ошибка сегментации. что это?ли массивы и ввод с scanf идет рука об руку?

int a[2]; 
for(i=0;i<2;i++) 
{ 
    scanf("%d",a[i]); 
    printf("%d",a[i]); 
} 

Почему он не может работать? оставить о декларациях. Имеет ли scanf какие-либо проблемы с задержкой?

+1

Пожалуйста, не используйте библиотечные функции, такие как 'scanf' и' printf', не зная его основного использования. Прочтите страницу руководства здесь http://linux.die.net/man/3/scanf. – VoidPointer

+0

@VoidPointer Это очень хороший комментарий, но я тоже спрашиваю вас. Да, scanf требует указатель, но то, что происходит, когда у него нет, - это мой вопрос. И, кроме того, я столкнулся с ошибкой сегментации. что в этом контексте?] – Mani

+0

Упомяните об этом в вопросе ясно. Аргументы 'scanf', указанные после спецификатора формата, рассматриваются и интерпретируются как ** указатели **. Поведение ** не определено **, когда после первого аргумента отправляются аргументы, отличные от значения типа integer 'a [i]'. – VoidPointer

ответ

2

Это:

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() еще пару раз. :)

+0

Однако это не требуется в printf. Почему это? и, пожалуйста, ответьте мне, что такое ошибка сегментации? – Mani

+0

@max Я добавил еще немного текста о 'printf()'. Вы можете [прочитать об ошибках сегментации] (http://en.wikipedia.org/wiki/Segmentation_fault) в другом месте. В основном это означает, что ваша операционная система обнаружила, что ваша программа сделала то, что ей не разрешено (например, попробуйте записать в память, которой она не владеет, интерпретируя целое число «a [i]» как указатель). – unwind

1

Передайте адрес [i] для сканированияf вместо значения [i].

scanf("%d",&a[i]); 
Смежные вопросы