【问题标题】:need help understanding enum and arrays需要帮助理解枚举和数组
【发布时间】:2016-07-25 07:00:27
【问题描述】:

我使用以下两行代码:

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

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

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

short bus[10];

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

我没有得到什么?

【问题讨论】:

  • 总线是全局数组吗?
  • 我没有得到确切的问题。但是让我解释一下,默认情况下enum 第一个成员的值是0,其余成员的值增加1C 也不会检查数组是否越界。
  • 确保您确实将值放入您稍后要获取的总线元素中。
  • @Checkmate 我的想法,除非数组是全局的,然后所有数组成员都初始化为 0
  • 枚举值由 C 标准指定从 0 开始并以 1 递增,您确定您正在直接访问 bus,而不是指向某个更大类型的指针吗? IE。 long *b = (long*)bus; b[4] 显然是个问题。

标签: c arrays enums


【解决方案1】:

很难说,因为您没有包含任何相关代码。但这里有一些方法可能会导致错误的值:

  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];
    

【讨论】:

    【解决方案2】:

    你初始化数组了吗?只写short bus[5]; 将为5 个short 变量分配内存,仅此而已。

    你可以做的是short bus[5] = {0};,它会将所有条目初始化为0,这样你就可以提前知道你正在处理什么。

    【讨论】:

    • OP 说他正在从数组内存范围之外获取数据。将值设置为零不会以任何方式影响它。
    • 查看我的其他评论:“... 好像我正在感染...”。
    • @jaska 如果我像您建议的那样初始化bus,它可以解决问题。为了确保我理解这里发生了什么:如果我分配内存 short bus[5] 然后执行 f.e. bus[3] = 5 实际上不会将值放在第 4 个内存位置?
    • @ErwinM:如果不查看您的确切代码,就不可能说出来。如果您从不初始化您的值,它们将像这个答案所暗示的那样是随机的。但是bus[3] = 5在两种情况下都设置正确的值,之后会是5;唯一的问题是您是否希望它是0在您第一次触摸它之前。编辑您的问题以包含一些您在这些位置写入和读取的函数。
    • 我应该注意在少数情况下我无法重现错误(更改枚举和数组的全局/局部性,分配错误的类型等)。但是,是的,这个想法是,在你实际初始化任何东西之前,数组中的数据不能保证为空,所以你会看到“奇怪”的值(与数组应该保存的类型相同)如果你尝试访问它。
    【解决方案3】:

    澄清一下:当您声明 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]。那么,您遇到的问题很可能与尝试获取您从未声明的总线元素(如果总线是局部变量,则该元素具有未定义的值)或无意中更改总线的某些元素有关代码(可能会产生意想不到的结果)。

    【讨论】:

    • ... 或访问未初始化的(本地)变量。
    • @RudyVelthuis:OP 说他正在从数组内存范围之外获取数据。这个float的实际值是否被初始化在这种情况下是无关紧要的。
    • @Groo:他说“好像我在想……”。不太一样,浮动是什么意思?
    • @Rudy:对不起,我同时在看一个不同的问题,我的意思显然是short。但是分配10 位置似乎可以解决问题的事实会让我认为同样的事情。
    • @groo 如果他实际上是通过索引访问超出数组内存范围的数据,他将无法编译。即尝试索引bus[100] 将给出边界错误...
    猜你喜欢
    • 2023-03-09
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2010-11-02
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多