如何从C函数返回2D数组?

如何从C函数返回2D数组?,c,arrays,return,C,Arrays,Return,所以我必须编写一个程序,对2d数组进行排序,然后返回它,但我刚刚发现不能从函数返回数组。我试着对此进行研究,但没有解决问题。谢谢你的帮助 下面是我编写的对垂直行进行排序的函数 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

所以我必须编写一个程序,对2d数组进行排序,然后返回它,但我刚刚发现不能从函数返回数组。我试着对此进行研究,但没有解决问题。谢谢你的帮助

下面是我编写的对垂直行进行排序的函数

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;


}
int-vertSort(int-matrix[][51],int-size)
{

对于(c=0;c函数的返回类型应该是
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**vertSort(int矩阵[][51],int大小)
{

对于(c=0;c来说,正确的语法是不可能的混乱,因此我建议使用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(*ptr51)[51];
ptr51顶点排序(整数矩阵[][51],整数大小)
{
矩阵[0][2]=99;
矩阵[1][1]=88;
回报(矩阵);
}
内部主(空)
{
int test[2][51]={{10,20,30},{40,50,60};
ptr51输出=垂直排序(测试,0);
对于(int行=0;行<2;行++)
{
for(int col=0;col<3;col++)
printf(“%d”,输出[行][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" );
    }
}
int(*(顶点排序(int矩阵[][51],int大小))[51]
{
矩阵[0][10]=99;
矩阵[1][50]=88;
回报(矩阵);
}
内部主(空)
{
int test[2][51]={{10,20,30},{40,50,60};
int(*输出)[51]=顶点排序(测试,0);
对于(int行=0;行<2;行++)
{
for(int col=0;col<51;col++)
printf(“%d”,输出[行][col]);
printf(“\n”);
}
}

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

返回?为什么?您正在将此数组传递到函数中。它可以作为2D指针返回。但r、c值仍然是单独返回的。为什么不将其作为引用传递。即使您可以从函数返回数组,也不会对您有任何好处,因为你不能在C中为数组赋值。
for(r=0;我认为当
int[][51]
作为
int**
访问时,C会显示错误。要学究一点,这是一个警告,而不是一个错误(无论如何,带有叮当声),但您当然是对的;忽略警告是一种不好的做法,因此显式案例很好。+1忽略警告是一种不好的做法,但丢弃警告则是一种更糟糕的做法。如果将事件传递给
vertSort()
实际上是一个二维数组,将其作为
int**
返回并试图通过该指针访问它将是灾难性的。如果您实际传递的是
int**
,则会出现同样的问题。该警告有一个很好的理由。这是完全错误的,数组与指针不同。静默使用强制转换的编译器警告不会产生魔力。感谢您的帮助!我将int返回类型切换为void,但现在当我尝试运行该程序时,底部出现了一个错误,表示警告“vertSort”的冲突类型也在原型中更改它