любопытное поведение сканфа - PullRequest
1 голос
/ 03 февраля 2011

Я понимаю, что этот код неисправен.Тем не менее, я столкнулся с каким-то странным поведением, которое мне было интересно, может кто-нибудь объяснить.

Пример 1:

   char *foo;
   scanf("%s",foo);
   printf("%s",foo);

Вывод: (ноль) .

Пример 2:

  int i;
  char *foo;
  scanf("%s",foo);
  printf("%s",foo);

Вывод: val of foo !

Почему присутствие int i может вызвать это«работать»?

1 Ответ

6 голосов
/ 03 февраля 2011

foo - это указатель, но вы не установили его так, чтобы он указывал на любую выделенную память, поэтому вместо этого он просто имеет случайное значение при запуске и, следовательно, указывает на какой-то случайный участок памяти.Следовательно, может произойти все, что угодно (например, неопределенное поведение ).

Наличие int i просто меняет позицию foo в стеке и, следовательно, конкретное случайное значение, которое оно имеет,Вы не должны читать что-либо значимое в этом отличающемся поведении, поскольку оно все еще не определено.

...