动态分配二维数组的最佳用法

optimal usage of dynamicly allocated two-dimensional array

我有一个二维数组,需要动态分配,所以我这样写:

int * array;
array = malloc((sizeA * sizeB) * sizeof(int));

它基本上是一个一维数组,就像一个二维数组一样。我正在按如下方式访问它:

for(int y = 0; y <= sizeA; y++){
   for(int x = 0; x <= sizeB; x++){
      array[x * y] = /* some stuff */;
   }
}

我以为这样写就可以了,但在某些情况下这是行不通的。

情况一:x * y多次结果相同

x = 3, y = 2

x * y = 6

x = 2, y = 3

x * y = 6,还有

这意味着某些值会被覆盖并丢失。但是还有一种情况会导致问题。

情况 2: 主数超出 sizeA 或 sizeB 的范围

有些值不能使用,因为主要数字只能是数字本身与 1 相乘的结果。因此,虽然我的数组中的某些值被覆盖,但其他一些值甚至没有被使用。

我能做些什么来防止这种情况发生?

您需要先将列大小乘以行数,然后加上列数。

for(int y = 0; y < sizeA; y++){
   for(int x = 0; x < sizeB; x++){
      array[x + y * sizeB] = /* some stuff */;
   }
}

此外,您想使用 < 而不是 <=,这样您就不会出现差一错误。

这是一个图形视图,可让您更好地了解其工作原理:

  |  0 |  1 |  2 |  3 |
-----------------------
0 |  0 |  1 |  2 |  3 |
-----------------------
1 |  4 |  5 |  6 |  7 |
-----------------------
2 |  8 |  9 | 10 | 11 |