Вы не можете - в C. В C инициализация глобальных и локальных статических переменных разработана так, что компилятор может статически помещать значения в исполняемый файл. Он не может обрабатывать неконстантные выражения как инициализаторы. И только в C99 вы можете использовать непостоянное выражение в агрегатных инициализаторах - не так в C89!
В вашем случае, поскольку ваш массив - это массив, содержащий символы, каждый элемент должен быть выражением арифметической константы. Посмотрите, что это говорит о тех
Арифметическое константное выражение должно иметь арифметический тип и должно иметь только
операнды, которые являются целочисленными константами, плавающими константами, константами перечисления, символом
константы и размер выражений.
Конечно, это не удовлетворяет ваш инициализатор, который использует операнд типа указателя. Конечно, другой способ - инициализировать ваш массив с использованием строкового литерала, как это также объясняется
Все выражения в инициализаторе для объекта со статической продолжительностью хранения должны быть константными выражениями или строковыми литералами.
Все цитаты взяты из проекта комитета C99 TC3. Итак, чтобы сделать вывод, что вы хотите сделать - используя неконстантное выражение - нельзя сделать с C. У вас есть несколько вариантов:
- Пишите свои вещи несколько раз - один раз в обратном порядке, а другой раз не в обратном порядке.
- Изменить язык - C ++ может сделать все это.
- Если вы действительно хотите сделать это, используйте массив
char const*
вместо
Вот что я имею в виду под последним вариантом
char const c[] = "ABCD";
char const *f[] = { &c[0], &c[1], &c[2], &c[3] };
char const *g[] = { &c[3], &c[2], &c[1], &c[0] };
Это отлично работает, так как выражение константы адреса используется для инициализации указателей
Константа адреса - это нулевой указатель, указатель на l-значение, обозначающее объект статической длительности хранения, или указатель на указатель функции; он должен быть создан явно с использованием унарного оператора & или целочисленной константы, приведенной к типу указателя, или неявно с помощью выражения массива или типа функции. Массив-индекс [] и членский доступ. и -> операторы, унарные операторы адреса и косвенности * и приведение указателей могут использоваться при создании адресной константы, но при использовании этих операторов значение объекта не должно быть доступно.
Возможно, вам повезет с настройкой параметров компилятора - еще одна цитата:
Реализация может принимать другие формы константных выражений.