【问题标题】:How to return a 2D array from a C function?如何从 C 函数返回二维数组?
【发布时间】:2014-12-19 20:54:22
【问题描述】:

所以我必须编写一个对二维数组进行排序然后返回它的程序,但我刚刚发现你不能从函数中返回一个数组。我尝试对此进行研究,但没有解决问题。任何帮助表示赞赏,谢谢。

以下是我编写的用于对垂直行进行排序的函数。

int vertSort(int matrix[][51], int size)
{
    for(c=0;c<size;c++)
    {

        for(r=0;r<size-1;r++)
        {
            if(matrix[c][r]>matrix[c][r+1])
            {
                printf("Swap row %d column %d with row %d column %d", r, c, r, c)
                int tmp=matrix[c][r];
                matrix[c][r]=matrix[c][r+1];
                matrix[c][r+1]=tmp;


            }

        }
    }
    return matrix;


}

【问题讨论】:

  • 返回?为什么?您正在将此数组传递给您的函数。
  • 它可以作为二维指针返回。但仍然会分别返回 r,c 值。
  • 你为什么不把它作为参考传递。
  • 即使你可以从一个函数中返回一个数组,它也对你没有任何好处,因为你不能在 C 中赋值给数组。
  • for(r=0;r&lt;size-1;r++) 与签名中的51 不匹配;将size 替换为51,反之亦然

标签: c arrays return


【解决方案1】:

您的代码不需要返回任何内容,它会修改调用者的数组副本。 (数组不能在 C 中按值传递)。将int 返回类型更改为void,一切都会好起来的。

【讨论】:

  • 感谢您的帮助!我将 int 返回类型切换为 void 但现在当我尝试运行程序时,底部出现错误,提示“vertSort”的类型冲突
  • 在原型中也改一下
【解决方案2】:

正确的语法不可能乱七八糟,所以我建议使用如下所示的 typedef

typedef int (*ptr51)[51];

ptr51 vertSort( int matrix[][51], int size )
{
    matrix[0][2] = 99;
    matrix[1][1] = 88;
    return( matrix );
}

int main( void )
{
    int test[2][51] = { { 10, 20, 30 }, { 40, 50, 60 } };

    ptr51 output = vertSort( test, 0 );

    for ( int row = 0; row < 2; row++ )
    {
        for ( int col = 0; col < 3; col++ )
            printf( "%d ", output[row][col] );
        printf( "\n" );
    }
}

这是没有 typedef 的不可能的混乱语法

int (*(vertSort( int matrix[][51], int size )))[51]
{
    matrix[0][10] = 99;
    matrix[1][50] = 88;
    return( matrix );
}

int main( void )
{
    int test[2][51] = { { 10, 20, 30 }, { 40, 50, 60 } };

    int (*output)[51] = vertSort( test, 0 );

    for ( int row = 0; row < 2; row++ )
    {
        for ( int col = 0; col < 51; col++ )
            printf( "%d ", output[row][col] );
        printf( "\n" );
    }
}

【讨论】:

    【解决方案3】:

    函数的返回类型应该是int **,类型转换矩阵应该是int **。它应该适合你。

    int** vertSort(int matrix[][51], int size)
    {
         for(c=0;c<size;c++)
         {
    
            for(r=0;r<size-1;r++)
            {
                 if(matrix[c][r]>matrix[c][r+1])
                 {
                    printf("Swap row %d column %d with row %d column %d", r, c, r, c)
                    int tmp=matrix[c][r];
                    matrix[c][r]=matrix[c][r+1];
                    matrix[c][r+1]=tmp;
    
    
                  }
    
             }
        }
        return (int **)matrix;
    
    
    }
    

    【讨论】:

    • 我认为当int [][51]int ** 访问时,C 会显示错误。
    • 学究起来,这是一个警告,而不是错误(无论如何都是clang),但你当然是对的;忽略警告是不好的做法,所以明确的情况很好。 +1
    • 忽略警告是不好的做法,但将它们丢弃是更糟糕的做法。如果传递给vertSort() 的东西实际上是一个二维数组,则将其作为int ** 返回并尝试通过该指针访问它将是灾难性的。如果您实际上是在传递int **,那么您将遇到同样的问题。这个警告是有充分理由的。
    • 这是完全错误的,数组不同于指针。使用强制转换使编译器警告静音不会产生魔法。