Фактически strlen
должен исключать нулевой символ, поэтому вывод 3
является правильным. Проблема со второй версией заключается в том, что a [7] не инициализируется, поэтому его значения могут быть произвольными. В этом случае просто так получается, что 5-е значение равно 0, а 0-е - нет, следовательно, вывод 4. Обратите внимание, что во второй версии вы используете неправильные индексы - индексация массивов начинается с 0, а не с 1.
Если вы хотите, чтобы это работало во второй версии, переписайте это так:
int main(void)
{
char a[7] = {0};
a[0] = 'a';
a[1] = 'n';
a[2] = 'd';
printf("size: %d length: %d",sizeof(a), strlen(a) );
}
Это инициализирует первое значение в a в 0 явно и неявно делает все остальные значения также равными нулю.