Приведение анонимного двумерного массива

Можно ли создать такой анонимный массив?

char **values = (*char[]){"aaa", "bbb", "ccc"};

Этот метод работает:

char **values
char *tmp[] = {"aaa", "bbb", "ccc"};
values = tmp;

Если вы найдете способ создать такой массив напрямую, вам, вероятно, следует завершить его с помощью NULL, иначе не будет возможности найти конец: char **values = (*char[]){"aaa", "bbb", "ccc", NULL};

Andrew Henle 19.11.2022 14:25

Re “(*char[]){"aaa", "bbb", "ccc"}”: Это опечатка; ты имеешь в виду (char *[]){"aaa", "bbb", "ccc"}?

Eric Postpischil 19.11.2022 14:26

Нет, это не так. Я думал, что это правильно.

bartool 19.11.2022 15:41
[JS за 1 час] - 9. Асинхронный
[JS за 1 час] - 9. Асинхронный
JavaScript является однопоточным, то есть он может обрабатывать только одну задачу за раз. Для обработки длительных задач, таких как сетевые запросы,...
Топ-10 компаний-разработчиков PHP
Топ-10 компаний-разработчиков PHP
Если вы ищете надежных разработчиков PHP рядом с вами, вот список лучших компаний по разработке PHP.
Скраппинг поиска Apple App Store с помощью Python
Скраппинг поиска Apple App Store с помощью Python
📌Примечание: В этой статье я покажу вам, как скрапировать поиск Apple App Store и получить точно такой же результат, как на Apple iMac, потому что...
Редкие достижения на Github ✨
Редкие достижения на Github ✨
Редкая коллекция доступна в профиле на GitHub ✨
Подъем в javascript
Подъем в javascript
Hoisting - это поведение в JavaScript, при котором переменные и объявления функций автоматически "перемещаются" в верхнюю часть соответствующих...
Улучшение генерации файлов Angular
Улучшение генерации файлов Angular
Angular - это фреймворк. Вы можете создать практически любое приложение без использования сторонних библиотек.
4
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

#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 **.

Eric Postpischil 19.11.2022 14:27

@ Эрик Да, действительно. После некоторого возни и устранения путаницы я предложил это в качестве альтернативы. ;-)

Adrian Mole 19.11.2022 14:39

Другие вопросы по теме