Как инициализировать массив без знака переменной длины?

Я прочитал это (Как инициализировать массив без знака?), но это не совсем отвечает на мой вопрос.

Я знаю, что могу создать массив строк, как это:

const char *str[] =
{
"first",
"second",
"third",
"fourth"};

и если я хочу написать (), то я могу использовать: write (fd, str [3], sizeof (str [3]));

Но что, если мне нужен массив беззнаковых символов переменной длины? Я попробовал это:

const unsigned char *cmd[] =
{
{0xfe, 0x58},
{0xfe, 0x51},
{0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23},
{0xfe, 0x3d, 0x02, 0x0f}
};

и я получаю предупреждения компиляции GCC, такие как
* «скобки вокруг скалярного инициализатора» * «инициализация делает указатель из целого числа без приведения»

2

Решение

Это один из способов

const unsigned char cmd1[] = {0xfe, 0x58};
const unsigned char cmd2[] = {0xfe, 0x51};
const unsigned char cmd3[] = {0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23};
const unsigned char cmd4[] = {0xfe, 0x3d, 0x02, 0x0f};

const unsigned char *cmd[] =
{
cmd1,
cmd2,
cmd3,
cmd4
};
5

Другие решения

Когда используются многомерные массивы, вы должны указать размер последнего измерения, чтобы компилятор вычислил правильную адресную арифметику.
Ваш массив указателей cmd имеет два измерения. Второе измерение имеет максимальную длину 6 элементов, поэтому:

const unsigned char cmd[][6] =
{
{0xfe, 0x58},
{0xfe, 0x51},
{0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23},
{0xfe, 0x3d, 0x02, 0x0f}
};

Из стандарта ANSI C:
«Если массив неизвестного размера инициализирован, его размер определяется по наибольшему индексируемому
элемент с явным инициализатором. В конце списка инициализаторов массив больше не
имеет неполный тип. «

Проект стандарта ANSI C C11

0

Это сработало для меня (компилируется с Clang & НКУ):

const unsigned char *cmd[] =
{
(unsigned char[]){0xfe, 0x58},
(unsigned char[]){0xfe, 0x51},
(unsigned char[]){0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23},
(unsigned char[]){0xfe, 0x3d, 0x02, 0x0f}
};
0
По вопросам рекламы [email protected]