Этот код является правильным?
char *argv[] = { "foo", "bar", NULL };
Это синтаксически правильно, и он действительно создает массив строк с завершающим NULL.
argv передается в main
как char * []
(или, что эквивалентно, char **
), но «правильнее» обрабатывать строковые литералы как const char *
, а не как char *
. Итак, в этом конкретном примере вам понадобится const char * argv [] = {"foo", "bar", NULL};
Возможно, вы действительно не собираетесь инициализировать его с помощью "foo", но фактически с изменяемой строкой, которую вы захотите изменить с помощью argv. В этом случае верно char * []
. Это то, что, вероятно, имел в виду Чарльз, говоря, что «правильный» код зависит от того, что вы с ним делаете.
Нет ничего очевидного неправильного в объявлении или инициализации, но то, является ли оно «правильным», зависит от того, что на самом деле делает остальная часть кода с argv
.
Да, ваш код формально верен (хотя см. Замечание Стива о const
). Он создаст массив, который заканчивается нулевым указателем типа char *
.
Вы также можете использовать
char *argv[4] = { "foo", "bar" };
или
char *argv[10] = { "foo", "bar" };
, если ваш массив по какой-то причине должен иметь определенный размер. В этом случае для дополнительных элементов также будут установлены нулевые указатели, даже если вы не инициализируете их явно. Но я бы сказал, что даже в этом случае лучше использовать
char *argv[4] = { "foo", "bar", NULL };
, потому что это будет гарантировать, что массив действительно достаточно длинный, чтобы получить завершение нулем (если массив окажется слишком коротким, компилятор сгенерирует диагностическое сообщение).