【问题标题】:Issue with returning a 2 dimensional array返回二维数组的问题
【发布时间】:2013-03-08 17:50:10
【问题描述】:

我被要求编写一个获取二维数组(矩阵)、列数和行数的程序,程序将返回转置矩阵(不使用 [][],意味着只使用指针算法)

我写的程序,确实转置了矩阵,没问题。我的问题是了解如何返回。这是我的代码:

int** transpose_matrix(matrix mat1,int number_of_rows,int number_of_columns)
{
    matrix mat2;
    int row_index,column_index;
    for(row_index=0;row_index<number_of_rows;row_index++)
    {
        for(column_index=0;column_index<number_of_columns;column_index++)
            **(mat2+(column_index*number_of_rows)+row_index)=**(mat1+(row_index*number_of_columns)+column_index);
    }
    // at this point, mat2 is exactly the transpose of mat1
    return mat2;
}

现在这是我的问题:我不能返回一个矩阵,我能做的最接近的事情是返回矩阵的第一个值的地址,但即使我这样做了,矩阵的所有其余部分都将无法使用一旦我退出 transpose_matrix 函数回到 void main...我怎样才能返回 mat2?

【问题讨论】:

  • @nhahtdh malloc 不在堆栈上分配空间。
  • @nhahtdh 这是动态的堆。
  • 想到堆,但写堆栈。 #_#

标签: c pointers matrix return transpose


【解决方案1】:

一、二维数组不是双指针。

二、动态分配。如果matrix是二维数组类型,那么写成这样:

typedef int matrix[ROWS][COLUMNS];
typedef int (*matrix_ptr)[COLUMNS];

matrix_ptr transpose_matrix(matrix m, int rows, int cols)
{
    matrix_ptr transposed = malloc(sizeof(*transposed) * rows);
    // transpose, then
    return transposed;
}

【讨论】:

  • @qPCR4vir 你为什么大喊大叫?
  • 无论如何,我想给你+1,但我想先看“//转置,然后”部分。
  • @qPCR4vir 抱歉,这无关紧要。 OP 已经编写了转置代码,他只是在寻求一种返回整个矩阵的方法。
  • @qPCR4vir 为什么不呢?
  • 也许我错了,但是 '(transposed+i)' 是 '((int)transposed+iCOLUMNS)' ??
【解决方案2】:

好的:这里有 3 件事:

  1. 您不能返回指向局部变量的指针(它将是垃圾 在返回和重用它所在的堆栈(内存)之后)。
  2. 数组在传递时衰减为指向第一个元素的指针。
  3. 指针算法:p+1 将 p 中的地址增加 sizeof(*p),所以 p 指向下一个元素,而不是下一个字节。

您的代码的简单修复(这适用于任何矩阵大小):

    int* transpose_matrix(int *mat1,int number_of_rows,int number_of_columns)
    {
        int *mat2=malloc(number_of_rows*number_of_columns*sizeof(int));
        int row_index,column_index;
        for(row_index=0;row_index<number_of_rows;row_index++)
        {
            for(column_index=0;column_index<number_of_columns;column_index++)
                mat2[column_index*number_of_rows+row_index]=mat1[row_index*number_of_columns+column_index];
        }
        // at this point, mat2 is exactly the transpose of mat1
        return mat2;
    }

...
    print(m,r,c); // I hope you have a print()
    int *t=transpose_matrix(m,r,c);
    print (t,c,r);
...
    // use t[max: c-1][max: r-1]
    free(t);

如果我们只有固定大小的矩阵(在 C99 中我们也可以使用可变长度数组!)。

typedef int  Matrix[ROWS][COLUMNS];
typedef int TMatrix[COLUMNS][ROWS];
typedef int (*pMatrix)[COLUMNS]; 
typedef int (*pTMatrix)[ROWS];  

pTMatrix transpose_matrix(Matrix m , int rows, int cols)
{
    pTMatrix t = malloc(sizeof(*t)*cols);
    for (int r=0; r<rows ; ++r)
    for (int c=0; r<cols ; ++r)
      t[c][r]=m[r][c];
    return t;
}

好吧,如果行和列是固定的,你不需要传递它....嗯...

【讨论】:

  • 好吧,这似乎行得通,但我现在有另一个问题,我需要打印转置矩阵,但是您已将 m 声明为指向整数的指针,所以您已将 2d数组转换成一维数组,如何打印转置矩阵?
  • 使用像 ptr[rows * column + row] 这样丑陋的索引,:-(
猜你喜欢
  • 2020-01-14
  • 1970-01-01
  • 2012-09-13
  • 2019-03-06
  • 2014-06-27
  • 2019-08-08
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多