在C中返回2D数组的数组

时间:2011-07-20 16:47:21

标签: c

首先,我承认这是作业,但自从我上一次用C语言编程以来已经有六年了,因为我只用Python和Java编程。

我想为二维数组生成后续二维数组,例如:

[1][2][3] 
[4][5][6] 
[7][8][ ]

对于上面的2D数组,后续2D数组将是:

[1][2][3]
[4][5][6]
[7][ ][8] 

[1][2][3]
[4][5][ ]
[7][8][6]

如果我只是在main()方法中放置代码,这不会有问题。

但是我想分离这部分的代码并将其封装在一个函数中,并在需要时调用它。换句话说,我想从函数内部生成两个数组并返回它们。

在C中,这并不是那么简单,因为我无法创建一个可以传递2D数组数组的函数。

我有一些想法,比如

  1. 返回一个带有2d数组的结构和下一个变量,它是指向另一个后继2D数组的指针(我想在循环中处理所有后继数组)。

  2. 创建一个全局指针,我将指向第一个结构,然后指向下一个成功者2d数组,依此类推。

  3. 但我真的不确定要尝试哪一个。寻找其他有用的线索。

2 个答案:

答案 0 :(得分:3)

返回2D数组的数组:

int*** getArrayOf2DArrays(int num_arrays, int rows_per_array, int cols_per_array)
{
    int*** arr = malloc(num_arrays * sizeof(int**));
    // check that arr isn't null

    for(int i = 0; i < num_arrays; i++)
    {
        arr[i] = malloc(rows_per_array * sizeof(int*));
        // again, check result

        for(int j = 0; j < rows_per_array; j++)
        {
            arr[i][j] = malloc(cols_per_array * sizeof(int));
            // yet again, check result

            // NOT necessary, but if you want to initialize the values
            // here, you could. Either use memset or:
            for(int k = 0; k < cols_per_array; k++)
                arr[i][j][k] = 0;
        }
    }

    return arr;
}

然后您可以使用arr[array_number][row][col]访问它。确保在完成后释放它(类似的过程,仅反过来):

void freeArrayOf2DArrays(int*** arr, int num_arrays, int rows_per_array)
{
    // sanity checks here
    for(int i = 0; i < num_arrays; i++)
    {
        // and here
        for(int j = 0; j < rows_per_array)
            // and here
            free(arr[i][j]);
        free(arr[i]);
    }

    free(arr);
}

当然,您可以使用int***数据类型将此指针传递给任何函数。

答案 1 :(得分:1)

2D数组数组只是一个3D数组,因此您可以使用与参数/返回值相同的方式传递它们。由于您在2维中有固定的大小,因此使用int *作为类型可能要容易得多,并将其视为3D数组