2010-05-01 3 views

ответ

8

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

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

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

+0

Да, для интерфейсов может потребоваться 'char * []', который рассматривается как 'const char * []', но с таким кратким вопросом это невозможно узнать. –

+0

Спасибо, это решает мой вопрос. Я получил некоторые предупреждения в своем коде: предупреждение: инициализация отбрасывает квалификаторы от указателя целевого типа Они ушли сейчас – jjardon

5

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

0

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

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

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

или

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

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

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

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

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