Правильно ли этот код?Правильный способ инициализации массива строк с нулевым завершением в C
char *argv[] = { "foo", "bar", NULL };
Правильно ли этот код?Правильный способ инициализации массива строк с нулевым завершением в C
char *argv[] = { "foo", "bar", 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 };
, потому что будет убедиться, что массив действительно достаточно долго, чтобы получить завершающий нуль (если массив случается слишком короткие, компилятор будет генерировать диагностическое сообщение).
Да, для интерфейсов может потребоваться 'char * []', который рассматривается как 'const char * []', но с таким кратким вопросом это невозможно узнать. –
Спасибо, это решает мой вопрос. Я получил некоторые предупреждения в своем коде: предупреждение: инициализация отбрасывает квалификаторы от указателя целевого типа Они ушли сейчас – jjardon