Вы можете назначить ему строковый литерал во время инициализации, поскольку это поддерживается языком. И не путайте присвоение с инициализацией. Во время присваивания, поскольку это массив символов, вы должны изменять значение символ за символом. Вы пытаетесь адресовать первый адрес строкового литерала первому символу массива (имя массива возвращает адрес первого элемента массив). И это явно не правильно, так как первый элемент не является указателем, он не может хранить адрес.
кто-нибудь объяснить, почему это работает с указателем:
char * str1;
str1 = "Hello1";
str1 = "new string";
// but not this
char str2 [] = "hello";
str2 = "four";
// or this
char str3 [];
str3 = "hello";
str3 = "hello";