Typedefed数组类型不可分配

时间:2018-01-21 15:30:31

标签: c arrays pointers typedef

我正在尝试构建一个简单的VM。我有一个数组代表它的内存(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;
}

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

谢谢!

2 个答案:

答案 0 :(得分:3)

这将是(正确的访问方式)

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

由于指向数组的指针属于uint8_t (*)[]类型(这是m的类型)。因此,您需要在访问其元素之前取消引用它。

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

答案 1 :(得分:2)

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

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

解决方案?不要让m成为指针。