Среди этих объявлений
char **argv = {"foo","boo"};
char *argv[] = {"foo","boo"};
char ****argv[] = {"foo","boo"};
допустимо только второе объявление.
Первое объявление недопустимо, поскольку вы не можете использовать список в фигурных скобках с более чем одним выражением для инициализациискалярный объект. И даже если вы будете использовать только один строковый литерал в фигурных скобках в первом объявлении, тем не менее тип объявленной переменной (char **
) и тип инициализатора (char *
) различны, и не существует неявного преобразования между типами.
Третье объявление недопустимо, поскольку не существует неявного преобразования между типом char *
(типом строковых литералов, используемых в качестве инициализаторов) и типом char ****
.
Допустимые объявленияв C символьных массивов с использованием представленного списка инициализаторов может быть
char *argv1[] = {"foo","boo"};
char argv2[][3] = {"foo","boo"};
char argv3[][4] = {"foo","boo"};
Вот демонстрационная программа
#include <stdio.h>
int main(void)
{
char *argv1[] = {"foo","boo"};
char argv2[][3] = {"foo","boo"};
char argv3[][4] = {"foo","boo"};
printf( "%s, %s\n", argv1[0], argv1[1] );
printf( "%3.3s, %3.3s\n", argv2[0], argv1[1] );
printf( "%s, %s\n", argv3[0], argv3[1] );
return 0;
}
Его вывод
foo, boo
foo, boo
foo, boo
Чтобы сделатьпервое правильное значение инициализации, которое вы можете написать
char * p[] = {"foo","boo"}
char **argv = p;
Другой способ - использовать составной литерал, например
char **argv= ( char *[] ){"foo","boo"};
Вот еще одна демонстрационная программа
#include <stdio.h>
int main(void)
{
char **argv= ( char *[] ){"foo","boo"};
printf( "%s, %s\n", argv[0], argv[1] );
return 0;
}
Еевывод
foo, boo