【问题标题】:Typedefed array type is not assignableTypedefed 数组类型不可赋值
【发布时间】:2018-01-21 15:30:30
【问题描述】:

我正在尝试构建一个简单的虚拟机。我有一个代表它的内存的数组(uint8_t 的数组)。为了更具表现力,我 typedef 一个数组 uint8_t:

typedef uint8_t chip8_memory[0xfff];

我将此数组作为参考传递给我的代码库:

void chip8_2nnn(const chip8_opcode oc, chip8_cpu_state* cs, chip8_memory* m) {
    m[cs->sp]     = cs->pc & 0xff;
    m[cs->sp + 1] = cs->pc >> 8;
    cs->sp -= 2;
    cs->pc = nnn(oc);
}

上述函数产生如下错误:

chip8.c:41:17: error: array type 'chip8_memory' (aka 'uint8_t [4095]') is not assignable
  m[cs->sp]     = cs->pc & 0xff;
  ~~~~~~~~~     ^
chip8.c:42:17: error: array type 'chip8_memory' (aka 'uint8_t [4095]') is not assignable
  m[cs->sp + 1] = cs->pc >> 8;
  ~~~~~~~~~~~~~ ^
2 errors generated.

最小的失败示例:

TEST(foo, bar) {
    typedef int foo[3];
    foo  bar = {1, 2, 3};
    foo* baz = &bar;

    bar[2] = 5;
    baz[2] = 5;
}

解决此问题的最佳方法是什么?我想要一个类型名称,它表明它不仅仅是一个数组,而是内存。而且我还想在代码库中传递它并读取/修改它的值。

谢谢!

【问题讨论】:

    标签: c arrays pointers typedef


    【解决方案1】:

    会是(正确的访问方式是)

    (*m)[cs->sp]     = cs->pc & 0xff;
    

    因为指向数组的指针是uint8_t (*)[] 类型(这是m 的类型)。所以你需要在访问它的元素之前取消引用它。

    此外,如果您只是使用 chip8_memory m 作为函数的参数,那么您可以按照您的方式访问它 - 前提是您将数组作为参数传递。

    【讨论】:

    • 感谢您的回答!是的,确实,声明中的chip8_memory m 解决了我的问题。这很好:) 我认为为这个问题提供的两个答案都是正确的。我不确定该接受哪一个...这里应该有合并答案按钮...
    • @x7_.: 一切顺利
    【解决方案2】:

    chip8_memory* 类型是数组的指针,它不是数组本身。 chip8_memory* 的类型是uint8_t (*)[0xfff]

    这意味着m[any_index] 是一个chip8_memory 数组。而使用m(使用当前声明)的唯一可能方法是m[0][cs->sp](*m)[cs->sp]

    解决方案?不要将m 设为指针。

    【讨论】:

    • 感谢您的回答!这确实回答了我的问题。我不应该将m 声明为指针。如另一个答案中所述,我发现这两个答案都有帮助且正确。不知道该接受哪一个...
    猜你喜欢
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多