Для массива, которым являются примеры в bounty, достаточно указать sizeof(names)/sizeof(names[0])
, чтобы определить длину массива.
Тот факт, что строки в примерах имеют разную длину, не имеет значения,names
- это массив char *
, поэтому общий размер массива в байтах равен числу элементов в массиве, умноженному на размер каждого элемента (то есть char *
).Каждый из этих указателей может указывать на строку любой длины или на NULL.Не имеет значения.
Тестовая программа:
#include<stdio.h>
int main(void)
{
char* names1[]={"A", "B", "C"}; // Three elements
char* names2[]={"A", "", "C"}; // Three elements
char* names3[]={"", "A", "C", ""}; // Four elements
char* names4[]={"John", "Paul", "George", "Ringo"}; // Four elements
char* names5[]={"", "B", NULL, NULL, "E"}; // Five elements
printf("len 1 = %zu\n",sizeof(names1)/sizeof(names1[0]));
printf("len 2 = %zu\n",sizeof(names2)/sizeof(names2[0]));
printf("len 3 = %zu\n",sizeof(names3)/sizeof(names3[0]));
printf("len 4 = %zu\n",sizeof(names4)/sizeof(names4[0]));
printf("len 5 = %zu\n",sizeof(names5)/sizeof(names5[0]));
}
Вывод:
len 1 = 3
len 2 = 3
len 3 = 4
len 4 = 4
len 5 = 5
РЕДАКТИРОВАТЬ:
Чтобы уточнить, это работает, только если выВы определили массив, т.е. char *names[]
или char names[][]
, и вы находитесь в области, где был определен массив.Если он определен как char **names
, у вас есть указатель, который работает как массив, и описанная выше техника не будет работать.Аналогично, если char *names[]
является параметром функции, в этом случае массив распадается на адрес первого элемента.