для константной, т.е. неизменной, строки нет необходимости задавать размер явно
Код: Выделить всё
char str1[6] = "hello"; // не надо так
char str[] = "hello"; // надо так
компилятор сам добавит дополнительный байт с ноликом. инициализация в фигурных скобках - это еще менее предпочтительный вариант, чем первый.
Код: Выделить всё
unsigned char str[5]={'h','e','l','l','o'}; // вот так будет задан МАССИВ, а не строка
разница между массивом и строкой в том, что компилятор ничего не добавляет сам, и вы получаете не строку с ноликом на конце, а массив из 5 символов.
если откинуть unsigned, то с точки зрения компилятора такой массив ничем от строки не будет отличаться, если его передавать в функции работы со строками, но именно в этом и кроется 90% всех багов операционных систем: в этом случае программа не сможет верно определить количество символов в строке! обычно все функции работы со строками знают, что если в строке попался ноль - это признак конца строки и дальше не надо лезть. в вышепоказанном примере такого нуля не будет, и любая функция работы со строкой полезет ЗА ПРЕДЕЛЫ этого массива по ОЗУ и бог знает, когда ей там попадется ноль и чего она к тому времени успеет натворить... не делайте так.