char *c[] = { "str1", "str2", "str3", "str4" };
char **c = { "str1", "str2", "str3", "str4" };
Первая строка действительна. Второй - нет. Зачем?Использование char **, инициализация char ** как массив строк в C
char *c[] = { "str1", "str2", "str3", "str4" };
char **c = { "str1", "str2", "str3", "str4" };
Первая строка действительна. Второй - нет. Зачем?Использование char **, инициализация char ** как массив строк в C
Вторая строка не является массивом, так что вы не можете использовать инициализации массива синтаксис
Первая строка является стандартным синтаксисом для инициализации массива char*
.
Вторая строка просто неверна, ошибка типа.
Посмотреть жить на coliru: http://coliru.stacked-crooked.com/a/53464db7e2f31cfa
Вы можете сохранить его с соединением-буквальным хотя (C99):
char **c = (char*[]){ "str1", "str2", "str3", "str4" };
берегись, непостоянное соединение литерал в автоматическом-хранилище если определено в функции.
Если вы хотите, чтобы быть постоянным буквальный (и, таким образом, в статической памяти), как струны (которые смешения имеют тип char[]
), сделать это таким образом:
char **c = (char**)&*(const char* const []){ "str1", "str2", "str3", "str4" };
это неправильное, вопрос отмечен C – 4pie0
@ 0d0a: Что не так? – Deduplicator
«Синтаксическая ошибка», http://ideone.com/0DNMqm – 4pie0
это две разные вещи, массив указателей char * и указатель char * на указатель char * - не то же самое –
При присвоении строковых литералов символу 'char *', сделайте себе одолжение и укажите класс хранения: 'const char *' .. бит 'const' является ключевым здесь –
Обратите внимание, что никогда не имеет смысла иметь простой неконстантный указатель на строковый литерал - он должен быть указателем на const. – Lundin