【问题标题】:How to return a multidimensional static array from a function in c如何从c中的函数返回多维静态数组
【发布时间】:2021-09-22 20:28:03
【问题描述】:

我想从一个函数返回一个多维矩阵。

所以我知道如何通过结构和动态分配来做到这一点。但我不确定如何使用静态多维数组来做到这一点。

#include <stdio.h>
static int **function(){
    static int array[5][10];
    return array;
}
int main(void){
    int** test;
    test = function();
    return 0;
}

Gcc 不断发出此警告:

警告:从函数返回 'int (*)[10]' 不兼容的返回类型'int **' [-Wincompatible-pointer-types] 返回数组;

我想知道为什么?

【问题讨论】:

  • 错误消息实际上包含您返回的实际类型:“returning 'int (*)[10]'”。这就是您需要的返回类型。你可能想为它创建一个类型别名(使用typedef)。
  • 至于理解发生了什么,请记住数组衰减指向其第一个元素的指针。也就是说,当您执行return array; 时,array 衰减为&amp;array[0]。由于array[0] 是一个包含十个int 元素的数组,所以&amp;array[0] 的类型是“指向十个int 数组的指针”,或者int (*)[10]

标签: c matrix multidimensional-array static return-type


【解决方案1】:

在这个返回语句中

return array;

数组指示符array 被转换为指向它的第一个int ( * )[10] 类型元素的指针。但是函数返回类型是int **。没有从 int ( * )[10] 类型到 int ** 类型的隐式转换。所以编译器会报错。

注意函数的使用者需要知道数组的大小。

所以我建议你像这样声明函数

static int ( *function( void ) )[5][10]
{
    static int array[5][10];
    return &array;
}

然后在 main 你可以写

int ( *test )[5][10] = function();

解引用指针test,您将获得数组。

这是一个演示程序。

#include <stdio.h>

enum { M = 5, N = 10 };

static int ( *function( void ) )[M][N] 
{
    static int array[M][N] =
    {
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
        { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 },
        { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },
        { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 },
        { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }
    };
    
    return &array;
}

int main(void) 
{
    int ( *test )[M][N] = function();
    
    printf( "The size of the array is %zu\n", sizeof( *test ) );
    
    for ( size_t i = 0; i < M; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            printf( "%d ", ( *test )[i][j] );
        }
        putchar( '\n' );
    }
    
    return 0;
}

程序输出是

The size of the array is 200
1 1 1 1 1 1 1 1 1 1 
2 2 2 2 2 2 2 2 2 2 
3 3 3 3 3 3 3 3 3 3 
4 4 4 4 4 4 4 4 4 4 
5 5 5 5 5 5 5 5 5 5

您可以通过以下方式为数组类型引入别名,以使函数声明更简单

#include <stdio.h>

enum { M = 5, N = 10 };

typedef int Array[M][N];

static Array * function( void ) 
{
    static Array array =
    {
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
        { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 },
        { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },
        { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 },
        { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }
    };
    
    return &array;
}

int main(void) 
{
    Array *test = function();
    
    printf( "The size of the array is %zu\n", sizeof( *test ) );
    
    for ( size_t i = 0; i < M; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            printf( "%d ", ( *test )[i][j] );
        }
        putchar( '\n' );
    }
    
    return 0;
}

【讨论】:

    【解决方案2】:

    “指向指针的指针”和“指向数组的指针”之间有很大的区别。在您的情况下,您需要一个“指向数组的指针”,这需要知道数组的第二维。请尝试以下操作:

    #include <stdio.h>
    
    static int (*function(void))[10] {
        static int array[5][10];
        return array;
    }
    
    int main(void) {
        int (*test)[10];
        test = function();
        return 0;
    }
    

    然后从main 你可以以test[i][j] 访问它。

    【讨论】:

    • 您可能还想使用类型别名来显示一个版本,因为这会使细化变得非常简单。
    【解决方案3】:

    你也可以使用void *函数。

    static void *function(void) 
    {
        static int array[5][10];
        return array;
    }
    
    int main(void) 
    {
        int (*test)[10] = function();
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-23
      • 2018-01-05
      • 2011-07-09
      • 2014-12-19
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 2012-12-08
      相关资源
      最近更新 更多