Потому что scanf не знает, какой длины массив.Переменная «имя» относится не к типу «массив», а к типу «указатель» (или «адрес»).Здесь написано, начните писать здесь и продолжайте писать, пока не закончите.Возможно, вам повезет, и у вас в стеке есть другие не критичные вещи, которые будут перезаписаны, но в конечном итоге scanf напишет, напишет и перезапишет что-то фатальное, и вы получите ошибку сегментации.Вот почему вы всегда должны указывать размер массивов.
Это все равно, что давать слепому человеку карандаш и говорить «начинайте писать здесь», чтобы они не могли видеть, где находится конец статьи.Они в конечном итоге напишут на столе и повредят что-нибудь.(Примечание: это не стук в слепую, это всего лишь метафора.)
В приведенном выше случае я настоятельно рекомендую использовать fgets () для получения определенной суммы из stdin, а затем sscanf ()извлечь любую информацию из этой строки и поместить ее в отдельные переменные по мере необходимости.Scanf () и fscanf () - зло, я никогда не находил для них использования, которое fgets () + sscanf () не может решить более безопасно.
char line[1024]; /* arbitrary size */
if( fgets( line, 1024, stdin ) != NULL )
{
fprintf( stdout, "Got line: %s", line );
}
Или для вещей за пределами строк:
# cat foo.c
#include <stdio.h>
int main( int argc, char **argv )
{
int i;
char line[1024];
while( fgets( line, 1024, stdin ) != NULL )
{
if( sscanf( line, "%d", &i ) == 1 )
{ /* 1 is the number of variables filled successfully */
fprintf( stdout, "you typed a number: %d\n", i );
}
}
}
# gcc foo.c -o foo
# ./foo
bar
2
you typed a number: 2
33
you typed a number: 33
<CTRL-D>