Для хранения "bug"
+ терминатор 0 вам нужно 4 символа , вы только выделите 3. Попробуйте:
char p[] = "bug";
Я подозреваю, что первый puts
работаетпотому что компилятор делает что-то смешное и может определить размер.
nmichaels имеет лучшее объяснение: Первый работает, потому что char *a
идет сразу после char p [3] в стеке.Терминатор null становится начальным значением для a и до тех пор, пока остается неинициализированным, p заканчивается на ноль.