需要帮助理解枚举和数组

时间:2016-07-25 07:00:28

标签: c arrays enums

我使用以下两行代码:

enum bus_sigs {  REG0, REGA, REGB, REGC, REGD };
short bus[5];

目的是使用枚举名称索引短裤数组。例如,我使用:bus[REGA]

我的行为很奇怪:如果我使用bus[REGC]我会得到奇怪的值,好像我从数组内存范围之外获取数据一样。如果我然后将第二行更新为:

short bus[10];

行为再次如预期。但这对我来说毫无意义。我只分配给bus数组中的5个成员。

我没有得到什么?

3 个答案:

答案 0 :(得分:2)

很难说,因为您没有包含任何相关代码。但是这里有一些方法可以得到错误的值:

  1. 使用大小错误的指针并读取数组的末尾:

    long* b = (long*)bus;
    result = b[4]; // this will read past the end of the array
    
  2. 您从其他位置复制到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);
    
  3. 您永远不会初始化数组,但在写入之前读取该值:

    // 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,这样你就可以准确地知道你正在处理的是什么。