2014-10-01 4 views
3
char *c[] = { "str1", "str2", "str3", "str4" }; 
char **c = { "str1", "str2", "str3", "str4" }; 

Первая строка действительна. Второй - нет. Зачем?Использование char **, инициализация char ** как массив строк в C

+0

это две разные вещи, массив указателей char * и указатель char * на указатель char * - не то же самое –

+1

При присвоении строковых литералов символу 'char *', сделайте себе одолжение и укажите класс хранения: 'const char *' .. бит 'const' является ключевым здесь –

+0

Обратите внимание, что никогда не имеет смысла иметь простой неконстантный указатель на строковый литерал - он должен быть указателем на const. – Lundin

ответ

5

Вторая строка не является массивом, так что вы не можете использовать инициализации массива синтаксис

+0

- это неопределенное поведение? – 4pie0

+0

@ 0d0a: это не может быть неопределенное поведение, если оно даже не компилируется! –

+0

@PaulR конечно, но [он компилируется] (http://ideone.com/0DNMqm) – 4pie0

3

Первая строка является стандартным синтаксисом для инициализации массива 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" }; 
+0

это неправильное, вопрос отмечен C – 4pie0

+0

@ 0d0a: Что не так? – Deduplicator

+0

«Синтаксическая ошибка», http://ideone.com/0DNMqm – 4pie0

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