Когда вы входите в функцию, в этом случае main()
стек увеличивается на величину, необходимую для фрейма стека, в фрейме стека есть место для всех auto (переменных, объявленных внутри функции), а также для других информация здесь не актуальна.
Так что в этом случае, когда вы пишете
char array[256]
когда программа входит в функцию, стек будет увеличен на столько, чтобы освободить место для 256 символов в массиве, значение символов в массиве не определено, возможно, эта область в памяти ранее была записана другая функция или программа, которая ей больше не нужна, поэтому мы не знаем, каково значение остальной части массива.
Когда вы пишете
char array[256] = {'a'}
это эквивалентно:
char array[256];
array[0] = 'a';
В этом случае мы не определили, что находится в остальной части массива
Когда вы делаете
memset(array, 'a', sizeof(array))
ЦП должен будет пройти через весь массив и инициализировать каждый символ в массиве в «a», создавая известное значение для всего в массиве за счет использования немного больше ЦП.