在内存中计算二维数组

Computing two dimensional arrays in memory

本文关键字:二维数组 计算 内存      更新时间:2023-10-16

首先,这是一个我不太确定的家庭作业问题。

const int TABLES = 10;
const int SEATS = 4;
Order diningRoom[TABLES][SEATS];

假设数组diningRoom从内存位置8000开始。如何用字节手工计算元素diningRoom[5][2]的地址?

A. 8000 + TABLES * 5 + 2
B. 8000 + sizeof(Order * TABLES * 2 + 5)
C. 8000 + sizeof(Order) * 5 * 2
D. 8000 + sizeof(Order) * (SEATS * 5 + 2)

我想答案是D,但我只是想在提交之前问一下SO。

D是正确答案

数组在内存中是连续排列的所以你的数组在内存中会显示为

Order diningRoom[10][4] == Order diningRoom[40]
0) Order | Order | Order | Order
1) Order | Order | Order | Order
2) Order | Order | Order | Order
3) Order | Order | Order | Order
4) Order | Order | Order | Order
5) Order | Order | Order | Order
6) Order | Order | Order | Order
7) Order | Order | Order | Order
8) Order | Order | Order | Order
9) Order | Order | Order | Order

因为你对diningRoom[5][2]感兴趣你实际上是在问diningRoom[SEATS*5 + 2]

0) Order | Order | Order | Order
1) Order | Order | Order | Order
2) Order | Order | Order | Order
3) Order | Order | Order | Order
4) Order | Order | Order | Order
5) Order | Order |[Order]| Order
6) Order | Order | Order | Order
7) Order | Order | Order | Order
8) Order | Order | Order | Order
9) Order | Order | Order | Order

答案可能更类似于正确的解决方案是C,但这实际上是错误的,因为它没有考虑到数组跨步,即SEATS*sizeof(Order)

解决方案A不包含任何Order对象的大小。
=>是错误的。

sizeof(Order * TABLES * 2 + 5)在溶液B中没有意义。
首先,类Order不能与整数相乘…
=>是错误的。

如果C是正确的,diningRoom[1][2]diningRoom[2][1]在相同的内存位置。
=>是错误的。

所以是d
如果我们将Order diningRoom[2][4];想象为

[0][0] [0][1] [0][2] [0][3]  
[1][0] [1][1] [1][2] [1][3]  

it's this in memory:

[0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] 

现在应该很容易看出为什么D是正确的。
对于元素[x][y],必须跳过x个完整的"行",
每行有4个元素(在我的例子中)