5

我通读了这个(如何初始化一个无符号字符数组?),但它并没有完全回答我的问题。

我知道我可以创建一个这样的字符串数组:

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

如果我想 write() 这些我可以使用: 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 编译警告,例如 *“标量初始化器周围的大括号”*“初始化使指针从整数而不强制转换”

4

3 回答 3

6

这是一种方式

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
};
于 2013-03-25T15:46:15.527 回答
1

这对我有用(使用 clang 和 gcc 编译):

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}
};
于 2013-03-25T16:30:47.277 回答
0

使用多维数组时,您必须指定最后一维的大小,以便编译器计算正确的地址算术。您的 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

于 2013-03-25T15:48:49.090 回答