这是返回二维数组的有效方法吗?

时间:2015-05-05 13:15:44

标签: c arrays multidimensional-array

给出以下C - 代码:

#include <stdio.h>

int mat1[2][4] = {
    {9, 10, 11, 12},
    {13, 14, 15, 16}
};

int (*(transpose)(int matrix[][4]))[2] {
    static int mat[4][2];
    int i;
    int j;

    printf("I am the function transpose()\nand I'm transposing 2x4 matrices.\n\n");
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 4; j++) {
            mat[j][i] = matrix[i][j];
        }
    }
    return mat;
}

int main() {
    int (*mat_transpose)[2];
    int i;
    int j;
    mat_transpose = transpose(mat1);

    for (j = 0; j < 2; j++) {
        for (i = 0; i < 4; i++) {
            printf("mat_transpose[%d][%d] = %d\n", i, j, mat_transpose[i][j]);
        }
    }
    return 0;
}

函数transpose()返回一个二维数组(或者更确切地说是指向指针数组的指针)。这是实现这一目标的有效方法吗?通过各种Stackoverflow问题,似乎没有标准的方法来做这个,而是很多。返回二维或多维数组是否有一些标准?

4 个答案:

答案 0 :(得分:3)

最好的解决方案是在调用函数中分配数组,就像这样

#include <stdio.h>

void transpose(int rows, int columns,
        int matrix[rows][columns], int mat[columns][rows])
{
    int i;
    int j;

    printf("I am the function transpose()\n");
    printf("And I'm transposing 2x4 matrices.\n\n");
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < columns; j++)
        {
            mat[j][i] = matrix[i][j];
        }
    }
}

int main()
{
    int mat1[2][4] =
    {
        {9, 10, 11, 12},
        {13, 14, 15, 16}
    };
    int mat_transpose[4][2];
    int i;
    int j;

    transpose(2, 4, mat1, mat_transpose);
    for (j = 0; j < 2; j++)
    {
        for (i = 0; i < 4; i++)
        {
            printf("mat_transpose[%d][%d] = %d\n", i, j, mat_transpose[i][j]);
        }
    }
    return 0;
}

mat1作为参数传递给全局变量绝对没有意义。

答案 1 :(得分:1)

  

这是返回二维数组的有效方法吗?

是。返回指向static局部变量的指针是有效的。我建议的一件事是你可以typedef返回类型

typedef matx[2];  

matx *transpose(int matrix[][4])){ /* Function body */ }

答案 2 :(得分:0)

你应该有你的功能

    int **transpose(int **matrix, int row, int columns)
    {
       int **mat;

       // Malloc you array, copy what you need and return it
       ...
    }

行和列是int **matrix

的行数和列数

答案 3 :(得分:0)

这是有效的,因为它做了它声称做的事情,但我想你已经知道了。

我不认为存在返回n维数组的标准,只有最佳实践。

我唯一可以说你的功能是它缺乏通用性(你只处理2 * 4矩阵)但可能那不是你的目标。