这是我的2D数组int myarray[79][24];
每当我更改第0行的元素时,它会同时更改另一个元素行24,反之亦然。
例如,myarray[35][0] = 'X';
同时将myarray[35][0]
和myarray[34][24]
更改为X.当我尝试myarray[40][24] = 'X';
时,它会同时更改myarray[40][24]
和myarray[41][0]
。
似乎第一行和最后一行互相镜像。我怎样才能阻止这种情况发生?
答案 0 :(得分:3)
连续的下标运算符指定多维数组对象的元素。 如果E是维度为i×j×...×k的n维数组(n≥2),则E(用作 除了左值之外)转换为指向(n - 1)维数组的指针 尺寸j×...×k。如果unary *运算符明确地应用于此指针,或 隐式地,作为下标的结果,结果是引用的(n-1)维 数组,如果用作左值而不是lvalue,它本身会被转换为指针。它跟随 从这个角度来看,数组以行主要顺序存储(最后一个下标变化最快)。
C是一种允许程序员做很多事情的语言。例如,没有IndexOutOfBoundsError
。数组只是指向第一个单元格的指针,然后它保留了下一个单元格的数组长度。
当你声明int [79] [24]时,它会预留79 * 24个单元格。他们一个接一个地去。如果数组维度为79x24,则索引在第一维中为0-78,在第二维中为0-23。地址34,24处的单元实际上是34,23之后的单元,在存储器中是35,0。
让我们在大小为6x4的数组上有一个例子:
Your array represented as expected by you with values:
+---+---+---+---+---+---+---+
| | 0 | 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+
| 1 | 0 | 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+
| 2 | 0 | 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+
| 3 | 0 | 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+
Your array with cell adresses (where start is the adress of cell 0,0):
+---+------------+------------+------------+------------+------------+------------+
| | 0 | 1 | 2 | 3 | 4 | 5 |
+---+------------+------------+------------+------------+------------+------------+
| 0 | start | start + 1 | start + 2 | start + 3 | start + 4 | start + 5 |
+---+------------+------------+------------+------------+------------+------------+
| 1 | start + 6 | start + 7 | start + 8 | start + 9 | start + 10 | start + 11 |
+---+------------+------------+------------+------------+------------+------------+
| 2 | start + 12 | start + 13 | start + 14 | start + 15 | start + 16 | start + 17 |
+---+------------+------------+------------+------------+------------+------------+
| 3 | start + 18 | start + 19 | start + 20 | start + 21 | start + 22 | start + 23 |
+---+------------+------------+------------+------------+------------+------------+
答案 1 :(得分:1)
您的数组在第一维中的范围为0到78,在第二维中的范围为0到23。当您尝试访问超出数组范围的元素时,行为未定义,任何事情都可能发生。这可能会导致您的问题。如果要访问index [x] [24],则必须按以下方式声明数组:int myarray[79][25]
。
“镜像”显然会发生,因为在内存中,数组元素彼此相邻分配,你可以想象它就像一条很长的线。因此,例如[1][23]
的索引之后就是(可能)索引[2][0]
。它(可能)虽然没有保证,但使用这样的构造并不是一个好主意。即使它被定义,也很混乱。
答案 2 :(得分:1)
数组的内存是连续的,所以尽管你定义了
int myarray[79][24];
访问
int n = myarray[34][24];
严格超出范围。
它可能会访问myarray[35][0]
,但该行为未定义。