我有一个二维数组存储[x] [y],想为每个x值存储8个不同的y值。由于某种原因,我可以读出数组中的特定位置,例如[48] [7],并且在填充数组中的其他空格后,[48] [7]的值已经改变,即使我从未碰过也很难。
int storage[127][7];
void store(){
storage[48][0] =0b01111110;
storage[48][1] =0b01111110;
storage[48][2] =0b11100011;
storage[48][3] =0b11010011;
storage[48][4] =0b11001011;
storage[48][5] =0b11000111;
storage[48][6] =0b01111110;
storage[48][7] =0b01111110;
Serial.println(storage[48][7], BIN); // returns 01111110
storage[49][0] =0b00000000;
storage[49][1] =0b11000001;
storage[49][2] =0b11000001;
storage[49][3] =0b11111111;
storage[49][4] =0b11111111;
storage[49][5] =0b00000001;
storage[49][6] =0b00000001;
storage[49][7] =0b00000000;
Serial.println(storage[48][7], BIN); // returns 0
}
根据我存储值的顺序,其中一些值会互相删除。
为什么我突然丢失数据?
编辑:我没有用正确的大小初始化数组。我应该用8而不是7。我必须学习数组从0开始计数,但是在初始化dont时!
答案 0 :(得分:2)
您正在定义一个行大小为7
的2D数组,但是您只能访问一行的8个元素:
int storage[127][7];
storage[48][0] =0b01111110;
...
storage[48][7] =0b01111110;
请注意,0..7实际上是8个元素,而不是7个元素。因此,您必须将storage
定义为...
int storage[127][8];
现在可以讨论int storage[127][7];storage[48][7] =0b01111110
是否为未定义的行为;
然而,最可能的行为是storage[48][7]
映射到与storage[49][0]
相同的内存地址。因此,当您分配storage[49][0] =0b00000000;
时,您也会“同时”写入storage[48][7]
,它将变成0b0000000
。