【问题标题】:How to initialize an unsigned char array of variable length?如何初始化可变长度的无符号字符数组?
【发布时间】:2013-03-15 03:54:15
【问题描述】:

我阅读了这个 (How to initialize a unsigned char array?),但它并没有完全回答我的问题。

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

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 编译警告,例如 *“标量初始化器周围的大括号” * "初始化使指针从整数不强制转换"

【问题讨论】:

  • 如果不为您的子阵列引入名称,您将无法做到这一点。顺便说一句,您的代码被窃听了write(fd, str[3], strlen(str[3]));strlen 不是 sizeof。指针上的sizeof 为您提供指针的大小,而不是它指向的数据的大小。
  • 不存在可变长度数组。您的 str 是一个指针数组,而不是可变长度数组。可以用字符串文字初始化指针。没有数组字面量,你不能用花括号列表初始化指针。
  • 好的,知道了。我理解并同意这里的 cmets。谢谢!!
  • 术语注释:在 C 中,“可变长度数组”又名 VLA 有一个非常具体的含义:它是一个长度在运行时确定的数组(即是一个变量或函数参数)。标准 C++ 没有 VLA。此外,整个功能有点问题,在 C 中使用它之前请先阅读它(在大多数情况下,你应该决定你实际上并不想使用它)。
  • 我知道这在多年(几十年)前的 Borland Turbo C++ v3.0 中对我有用。看到这个答案,看起来 GCC 在没有一些帮助的情况下不会自行转换为 char[]:stackoverflow.com/a/15619960/14055985

标签: c++ c arrays char unsigned


【解决方案1】:

这是一种方式

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
};

【讨论】:

  • 你能解释一下为什么子数组需要命名吗?
  • n.m.在上面的 cmets 中进行了解释。
【解决方案2】:

这对我有用(使用 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}
};

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 2013-04-29
      • 2016-05-03
      • 2010-12-14
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      相关资源
      最近更新 更多