2D-Array 会在存储新元素时删除元素本身

2D-Array deletes elements itself when new elements get stored

本文关键字:元素 删除 存储 新元素 2D-Array      更新时间:2023-10-16

edit:我没有用正确的大小初始化数组。我应该用 8 而不是 7。我必须知道数组从 0 开始计数,但在初始化时不要!

我有一个二维数组存储[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
}

根据我存储值的顺序,其中一些会相互删除。

为什么我突然丢失数据?

您正在定义一个具有行大小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