Только у вашего первого примера есть массив символов с нулевым символом в конце - два других примера не имеют символьного завершения, поэтому вы не можете использовать strlen()
для них в четко определенной форме.
char p[4]={'h','g','y'}; // p[3] is implicitly initialized to '\0'
char p[3]={'h','g','y'}; // no room in p[] for a '\0' terminator
char p[]={'h','g','y'}; // p[] implicitly sized to 3 - also no room for '\0'
Обратите внимание, что в последнем случае, если вы использовали строковый литерал для инициализации массива, вы получите нулевой терминатор:
char p[]= "hgy"; // p[] has 4 elements, last one is '\0'