Переменная temp не указывает на какое-либо хранилище (память) и неинициализирована.
если temp объявлен как char temp[32];
, тогда код будет работать независимо от того, где он объявлен. Однако существуют другие проблемы с объявлением temp с фиксированным размером, подобным этому, но это вопрос для другого дня.
Теперь, почему происходит сбой при объявлении глобально, а не локально. Удача ...
При локальном объявлении значение temp исходит из того значения, которое когда-либо находилось в стеке в это время. К счастью, он указывает на адрес, который не вызывает сбой. Тем не менее, это уничтожающая память, используемая кем-то другим.
Когда объявлено глобально, на большинстве процессоров эти переменные будут храниться в сегментах данных, которые будут использовать нулевые страницы по требованию. Таким образом, char *temp
выглядит так, как если бы оно было объявлено char *temp=0
.