2013-02-09 1 views
1

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

Некоторые структуры:

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}, 
      {?,?,?} 
     }; 

Спасибо.

ответ

1

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

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

В качестве альтернативы вы можете просто пройти мимо size_t.

+0

Да, я это понимаю. –

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^