Можно ли создать такой анонимный массив?
char **values = (*char[]){"aaa", "bbb", "ccc"};
Этот метод работает:
char **values
char *tmp[] = {"aaa", "bbb", "ccc"};
values = tmp;
Re “(*char[]){"aaa", "bbb", "ccc"}”: Это опечатка; ты имеешь в виду (char *[]){"aaa", "bbb", "ccc"}?
Нет, это не так. Я думал, что это правильно.
#include <stdio.h>
int main()
{
// The outer brackets on the RHS are not necessary but added for clarity...
char *(*values)[3] = &( (char* []) { "aaa", "bbb", "ccc" } );
for (int i = 0; i < 3; ++i) printf("%s\n", (*values)[i]);
return 0;
}
В качестве альтернативы вы можете воспользоваться тем фактом, что массив (даже определенный как составной литерал) автоматически «распадается» до указателя на его первый элемент (в большинстве случаев, в том числе при использовании в качестве RHS операции присваивания):
int main()
{
char** values = (char* []){ "aaa", "bbb", "ccc" };
for (int i = 0; i < 3; ++i) printf("%s\n", values[i]);
return 0;
}
В char ** нет ничего плохого, кроме опечатки в вопросе (*char вместо char *). Составной литерал (char *[]) {"aaa", "bbb", "ccc"} — это массив, который будет автоматически преобразован в char **.
@ Эрик Да, действительно. После некоторого возни и устранения путаницы я предложил это в качестве альтернативы. ;-)
Если вы найдете способ создать такой массив напрямую, вам, вероятно, следует завершить его с помощью NULL, иначе не будет возможности найти конец: char **values = (*char[]){"aaa", "bbb", "ccc", NULL};