Это объявление char ** p = {"a", "b"};
вызывает предупреждение, потому что C не знает, как интерпретировать содержимое {
}
фигурных скобок:
- Тип объявления
char**
предполагает, что это один указатель на указатель на символ
- Содержимое
{
}
определяет два элемента.
Вы должны указать C, что вы инициализируете указатель на указатель указателем на начальный элемент анонимного массива, указывая тип перед фигурными скобками:
char ** p = (char*[]){"a", "b"}
Эта конструкция называется «составной литерал». Он может использоваться в объявлении, но также работает как выражение.
Примечание: если вы планируете передать подобный массив функции, вам необходимо указать способ определения размера массива. Один из подходов состоит в том, чтобы передать NULL
для «завершения» массива, например:
void f(char **p) {
int i = 0;
while (*p) {
printf("%d:%s\n", i++, *p++);
}
}
int main(void) {
f((char*[]){"a", "b", NULL});
return 0;
}
Демо-версия.