В языке существует различие между массивами и указателями, даже если это различие кажется разбавленным как неявными преобразованиями (массивы имеют тенденцию распадаться на указатели довольно легко), так и общими утверждениями, которые одинаковы .
Как это вообще относится к вашему коду?
Ну, строковый литерал на самом деле представляет собой массив константных символов, а не указатель на символ (ы).При инициализации const char *fileName = "background1";
вы создаете переменную pointer , которая указывает на первый элемент массива ("background1" - это , затухающий в указатель на первый элемент), и изв переменной, которой вы управляете, есть указатель , а не литерал.
Если вы смешаете это с фактом, что sizeof
сообщит вам размер переменной, вы получите это вплатформа с 32-битными указателями и 8-битными символами, sizeof( const char* )
всегда равно 4, независимо от объекта, на который указывает этот указатель (если он есть).
Теперь, если вы рассматривали литерал какчто на самом деле вам повезет:
const char filename[] = "background1";
assert( sizeof filename == 12 ); // note: NUL character is counted!
const char *fname = filename;
assert( sizeof filename == sizeof( void* ) );
В реальном коде вам не так повезло, и во многих случаях литералы разлагались на указатели задолго до того, как вы получили шансполучить размер времени компиляции литерала, поэтому вы не можете попросить компилятор сообщить вам размер.В этом случае вам нужно вычислить длину строки стиля C, что можно сделать, вызвав strlen
.