[英]Typedefed array type is not assignable
我正在尝试构建一个简单的VM。 我有一个代表它的内存的数组( uint8_t
数组)。 为了更富有表现力,我对uint8_t
数组进行了typedef
:
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;
}
解决此问题的最佳方法是什么? 我想要一个类型名称,该名称表明它不仅是一个数组,而且是内存。 我也想将其传递给代码库,并读取/修改其值。
谢谢!
它将是(正确的访问方式将是)
(*m)[cs->sp] = cs->pc & 0xff;
由于指向数组的uint8_t (*)[]
的类型为uint8_t (*)[]
(这是m
的类型)。 因此,在访问其元素之前,需要先对其取消引用。
同样在这里,如果您只是将chip8_memory m
用作函数的参数,则可以按照您的方式访问它-前提是您将数组作为参数传递。
chip8_memory*
类型是指向数组的指针 ,而不是数组本身。 chip8_memory*
的类型为uint8_t (*)[0xfff]
。
这意味着m[any_index]
是chip8_memory
数组。 而且使用m
的唯一可能方法(使用当前声明)就像m[0][cs->sp]
或(*m)[cs->sp]
。
解? 不要让m
成为指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.