Правильный способ инициализации массива строк с нулевым символом в C - PullRequest
8 голосов
/ 01 мая 2010

Этот код правильный?

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

Ответы [ 3 ]

9 голосов
/ 01 мая 2010

Это синтаксически правильно, и он создает массив строк с нулевым символом в конце.

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

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

5 голосов
/ 01 мая 2010

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

0 голосов
/ 01 мая 2010

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

. Вы также можете сделать

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

или

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...