Числа в скобках являются индексами инициализаторов. Это функция C99.
Учитывая, что ваш пример кода использует этот недостаток, вы получаете вывод, что «foo» хранится в names[3]
, а NULL
хранится в names[2]
. Ваша программа вылетает при попытке puts(names[2])
, что совпадает с puts(NULL)
.
В противном случае ваш цикл будет повторяться до 16 или 32 итераций - вы делите на sizeof(char)
размер элемента массива и хотите использовать sizeof(char *)
.
Лучше использовать этот макрос:
#define DIMENSION_OF (a) (sizeof(a)/sizeof(a[0]))
Я предлагаю никогда не использовать какие-либо специфичные для C99 функции, такие как эти «назначенные инициализаторы».
Существует причина, по которой большинство ответов, полученных вами на этот вопрос, были сбиты с толку из-за того, что ваш цикл выводит только две строки, а не четыре. Причина в том, что C99 не получил широкого признания других программистов.
Есть несколько причин, по которым большинство программистов не знакомы с более характерными особенностями C99. Часто упоминаемая причина заключается в том, что C99 более несовместим с C ++, чем ANSI C, и затрудняет возможность будущего преобразования в C ++. Моя личная жалоба с C99 также делает излишние расширения ANSI C. Примером лишнего дополнения является пример из C99, который вы предоставили. Не используйте «обозначенные единицы». Обратитесь к Американскому национальному институту стандартов С. Стандарт. Не ссылаться на документ Международной организации по стандартизации C99.
Большинство функций, которые «приятно иметь» в C99, уже были доступны как расширения во всех основных компиляторах. Объявление переменной в выражении for-init-example является примером не-ANSI-C-стандартной функции, которая широко поддерживается. Встроенный тип complex
является примером не-ANSI-C-стандартной функции, которая широко не поддерживается.