C 2D阵列同时更改2个元素

时间:2016-11-23 19:23:57

标签: c arrays multidimensional-array

这是我的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]

似乎第一行和最后一行互相镜像。我怎样才能阻止这种情况发生?

3 个答案:

答案 0 :(得分:3)

规格:6.5.2.1 Array subscripting

  

连续的下标运算符指定多维数组对象的元素。   如果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],但该行为未定义。