2016-01-23 7 views
-5

что у меня есть следующий код:Почему char * дает мне ошибку сегментации?

char* input; 
scanf("%s",&input); 
printf("%s\n",input); 

дает ошибку сегментации, тогда как

char input[20]; 
scanf("%s",&input); 
printf("%s\n",input); 

не дает мне ошибку.

+0

Указатель в первом примере указывает на «нигде» (т. Е. Указывает на случайное местоположение). – usr2564301

+0

@ Jongware Это нормально, он никогда не использует его содержимое. И его следующая строка кода заполняет ее. –

+4

Собственно, ни один фрагмент не верен. Второй фрагмент передает '& input' в' scanf', когда он должен передавать 'input'. (Компилятор должен генерировать предупреждение об этом. Если нет, включите уровень предупреждения.) И спецификатор формата должен ограничивать количество символов (поскольку буфер невелик). Правильный спецификатор формата будет «% 19s». И код должен проверить возвращаемое значение из 'scanf'. Если 'scanf' терпит неудачу, тогда' input' будет неинициализирован, а 'printf' будет отображаться неопределенное поведение. Так что, как я вижу, у вас три ошибки в трех строках кода. – user3386109

ответ

2
char* input; 
scanf("%s",&input); 
printf("%s\n",input); 

Давайте возьмем его по строкам.

  1. Хорошо, поэтому input является char *.
  2. Но мы читаем в него строку.

Таким образом, у нас достаточно места для указателя на символ, но затем мы пытаемся сохранить все количество символов. Поэтому, если вводится больше символов, чем число, используемое для хранения указателя на символ, мы сбой.

Если вы хотите сохранить строку, вам нужно выделить место для строки, как в втором примере, который не дает ошибки. Просто измените среднюю линию на scanf("%s",input);. Вы хотите, чтобы input распался на указатель на его содержимое.

+2

Его второй пример также неверен. Он использует 'scanf' в' & input', где 'char input [20]'. –

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