【问题标题】:optimal usage of dynamicly allocated two-dimensional array动态分配的二维数组的优化使用
【发布时间】:2022-01-09 17:07:45
【问题描述】:

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

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 */;
   }
}

我认为这样写一切都很好,但在某些情况下这行不通。

案例1: x * y 多次得到相同的结果

x = 3, y = 2

x * y = 6

x = 2, y = 3

x * y = 6,同样

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

案例 2: 主号码超出 sizeA 或 sizeB 的范围

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

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

【问题讨论】:

    标签: c multidimensional-array dynamic-arrays


    【解决方案1】:

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

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

    另外,您想使用&lt; 而不是&lt;=,这样您就不会遇到一个错误。

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

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

    【讨论】:

    • 哦哦好的。我得到它。我实际上认为 '
    • 将其声明为 int (*array)[sizeA][sizeB]; = malloc(sizeof *array); 并将其与 (*array)[y][x] = ... 一起使用也是一种选择
    • @TedLyngmo 或 int (*arr)[sizeB] = calloc(sizeA, sizeof *arr); 并享受 arr[y][x] 语法
    猜你喜欢
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2021-02-03
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多