Корректный способ инициализировать ЗАВЕРШЕННЫЙ ПУСТЫМ УКАЗАТЕЛЕМ массив строк в C

Этот код является правильным?

char *argv[] = { "foo", "bar", NULL };
8
задан Oded 1 May 2010 в 17:18
поделиться

3 ответа

Это синтаксически правильно, и он действительно создает массив строк с завершающим NULL.

argv передается в main как char * [] (или, что эквивалентно, char ** ), но «правильнее» обрабатывать строковые литералы как const char * , а не как char * . Итак, в этом конкретном примере вам понадобится const char * argv [] = {"foo", "bar", NULL};

Возможно, вы действительно не собираетесь инициализировать его с помощью "foo", но фактически с изменяемой строкой, которую вы захотите изменить с помощью argv. В этом случае верно char * [] . Это то, что, вероятно, имел в виду Чарльз, говоря, что «правильный» код зависит от того, что вы с ним делаете.

9
ответ дан 5 December 2019 в 12:09
поделиться

Нет ничего очевидного неправильного в объявлении или инициализации, но то, является ли оно «правильным», зависит от того, что на самом деле делает остальная часть кода с argv .

5
ответ дан 5 December 2019 в 12:09
поделиться

Да, ваш код формально верен (хотя см. Замечание Стива о const ). Он создаст массив, который заканчивается нулевым указателем типа char * .

Вы также можете использовать

char *argv[4] = { "foo", "bar" }; 

или

char *argv[10] = { "foo", "bar" }; 

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

char *argv[4] = { "foo", "bar", NULL }; 

, потому что это будет гарантировать, что массив действительно достаточно длинный, чтобы получить завершение нулем (если массив окажется слишком коротким, компилятор сгенерирует диагностическое сообщение).

0
ответ дан 5 December 2019 в 12:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: