动态分配二维数组的最佳用法
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 |
我有一个二维数组,需要动态分配,所以我这样写:
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 |