Указатель NULL как маркер конца массива

Я прочитал 6.3-й абзац второго выпуска «C-программирования», Kernigan & Ritchie.

Некоторая структура:

struct key { char *word; int count; } keytab[NKEYS] { { "auto", 0 }, { "break", 0 }, { "case", 0 }, { "char", 0 }, { "const", 0 }, { "continue", 0 } }; 

Авторы писали об этом:

Количество NKEYS – это количество ключевых слов в keytab. Хотя мы можем считать это вручную, намного проще и безопаснее делать это с помощью машины, особенно если список может быть изменен. Одна из возможностей заключалась бы в том, чтобы закончить список инициализаторов с нулевым указателем, затем выполнить цикл по keytab до тех пор, пока не будет найден конец.

Все было бы ясно, если перечислены только указатели:

 struct key { char *word; char *description; } keytab[NKEYS] { { "auto", "" }, { "break", "" }, { "case", "" }, { "char", "" }, { "const", "" }, { "continue", "" } { NULL, NULL} }; 

Но каждая запись не указана только, но и int . Если я правильно понимаю авторов, то последняя запись должна выглядеть следующим образом:

 { NULL, ? } 

А как насчет не указателей?

Как я могу решить это для перечислений, которые не содержат указателей? Например:

  enum myEnum { int index; inr count; double value; } myVariable[] { {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {?,?,?} }; 

Спасибо.

Дело в том, что, установив последнюю запись в NULL, вы можете тривиально идентифицировать конец массива при итерации через него.

В случаях, когда у вас нет указателей, вы можете по-прежнему считать некоторое «специальное» значение, чтобы указать конец, возможно, count и index никогда не могут быть отрицательными в вашем приложении, поэтому просмотр значения меньше 0 будет возможным маркером, который вы может использовать, чтобы надежно найти конец. Другим распространенным выбором для конечных маркеров может быть ~0 (т.е. все 1s).

Кроме того, вы можете просто передать size_t с ним.

Вы можете придумать специальное значение enum (скажем, -1 ), которое вы использовали бы как маркер для последней записи.