скрытое меню

Строки

Строка это тоже указатель. Указатель на последовательность байт. Заканчивается последовательность байт символом '\0' .

Если символ '\0' отсутствует , то строка не заканчивается никогда (плохой вариант , в реальности это ошибка программиста).

Двойные ковычки подразумевают , что последовательность символов ("абс") заканчивается символом '\0'.

А вот одинарные кавычки 'abc' говорят , что к последовательности в конце НЕ добавляется символ '\0' . Это просто набор байтов.

Какая кодировка строки

Очень важный для понимания момент, что то что мы видим это не совсем то, что на самом деле является.

uint8_t *str="АБСДЕ"; 

str может быть и пять байтов и 10 байтов и еще много сколько чего.

Можно долго смотреть на "АБСДЕ" и не понимать почему это НЕ символы "АБСДЕ".

Короче все дело в какой кодировке ваш текстовый файл исходника ( например вы работаете с main.c).

Если файл кодировке UTF8 , то "АБСДЕ" это десять байт. Если в cp866 это уже 5 байт , если в win1251 то это тоже 5 байт , но уже совсем другие 5 байт.

Компилятор берет ваш тестовый файл и тупо парсит последовательность байт, доходит до uint8_t *str="АБСДЕ"; и получает (в UTF8) 10 байтов.

К сожалению компилятор тоже человек и сам он не может догадаться , что кодировка у вашего файла. Поэтому ему надо тоже как-то указывать в какой кодировке ваш проект (см. настройки проекта, там всегда есть кодировка).

Почему нельзя определить кодировку по содержимому файла?

На самом деле попытаться можно, но разных кодировок настолько много наплодили у каждой из стран мира и к сожалению забыли создать стандарт идентификации кодировки , то имеем то , что имеем на сегодняшний день.