我使用以下两行代码:
enum bus_sigs { REG0, REGA, REGB, REGC, REGD };
short bus[5];
目的是使用枚举名称索引短裤数组。例如,我使用:bus[REGA]
。
我的行为很奇怪:如果我使用bus[REGC]
我会得到奇怪的值,好像我从数组内存范围之外获取数据一样。如果我然后将第二行更新为:
short bus[10];
行为再次如预期。但这对我来说毫无意义。我只分配给bus
数组中的5个成员。
我没有得到什么?
答案 0 :(得分:2)
很难说,因为您没有包含任何相关代码。但是这里有一些方法可以得到错误的值:
使用大小错误的指针并读取数组的末尾:
long* b = (long*)bus;
result = b[4]; // this will read past the end of the array
您从其他位置复制到bus
数组,但使用了错误的计数:
short bus[5];
// this is 5
int count = sizeof(bus)/sizeof(bus[0]);
// this will copy 5 bytes, instead of 5 shorts
// (this is why bus[10] would fix the issue, for example)
memcpy(bus, some_location, count);
您永远不会初始化数组,但在写入之前读取该值:
// this *doesn't* clear the contents of the array
short bus[5];
// value of result is undefined
result = bus[4];
答案 1 :(得分:0)
澄清一下:当您声明enum bus_sigs { REG0, REGA, REGB, REGC, REGD };
时,您基本上是说这些关键字中的每一个都在枚举范围内获得以下分配:
int REG0 = 0;
int REGA = 1;
int REGB = 2;
int REGC = 3;
int REGD = 4;
这意味着bus[REG0]
相当于bus[0]
。那么,您遇到的问题很可能与尝试获取您从未声明的总线元素(如果总线是本地变量而具有未定义的值)或无意中更改了您的其他位置的某个总线元素有关。代码(可能会产生意外结果)。
答案 2 :(得分:0)
你有没有初始化阵列?只需编写short bus[5];
即可为5 short
个变量分配内存,但这就是全部。
你可以做的是short bus[5] = {0};
,它会将所有条目初始化为0,这样你就可以准确地知道你正在处理的是什么。