В языке С вы несете отвественность за размеры массивов и обязуетесь не выходить за их предеты, в противном случае ОС накажет вас за это.
Есть небольшое отличие строк от других типов массивов
В С зачастую работают с null-terminated строками (
https://en.wikipedia.org/wiki/Null-terminated_string).
Запись следующего вида:
char * filename = "data.txt";
Присваивает переменной типа указатель на константную строку, сохраненную в самом бинарном файле (вы можете открыть exe файл и найти там эту самую строку).
Строка представляет собой 9 символов (data.txt + \0), последний символ как раз и является нуль-терминатором.
В общем же случае, вы самостоятельно должны хранить в отдельной переменной размер массива
вот пример:
https://godbolt.org/z/MW4Kxh5s8