指向函数返回C中struct的矩阵

时间:2016-12-22 19:44:34

标签: c pointers struct function-pointers typedef

我正在尝试将typedef创建为函数指针,该指针返回struct的矩阵。 我试过了:

typedef struct my_struct**  (*func)(void)
typedef struct my_struct[4][4] (*func)(void)

但它们都没有奏效。 我的struct矩阵初始化为:

static struct my_struct matrix[4][4];

我的代码没有用typedef的2个选项编译。 我该如何创建这个typedef? 感谢。

2 个答案:

答案 0 :(得分:1)

无法返回数组。但是,您可以返回指向数组的指针。如果要从函数中检索二维数组,则应返回此内容。

该函数将返回一个指向4个结构数组的指针:

struct my_struct (*function(void))[4];

此类型的typedef:

typedef struct my_struct (*type(void))[4];
type* p = function;

答案 1 :(得分:1)

无法从函数返回数组。

可以返回指向数组第一个元素的指针。在您的情况下,数组的第一个元素本身就是一个数组(矩阵中的一行)。声明指向返回指向数组的指针的函数的指针所需的语法太神秘,无法直接使用。处理这种情况的最简单,用户友好的方法是使用typedef。

typedef struct my_struct row[4];  // a 4-element row in a matrix
typedef row* (*func)(void);       // pointer-to-function returning pointer-to-row

不能省略大小,不能使用指针而不是数组,即

typedef struct my_struct row[];
typedef row* (*func)(void);    // doesn't do what you want

typedef struct my_struct *row;
typedef row* (*func)(void);    // doesn't do what you want

您必须知道在C中不允许将指针返回到本地数组。

row* myfunc(void)
{
   struct my_struct my_matrix[4][4];
   return my_matrix; // will compile, but the behaviour is undefined
                     // a good compiler will warn you
}

您可以通过这种方式返回指向静态对象或动态分配对象的指针。

如果要返回对象而不是指针,则必须使用包装器结构。

typedef struct { struct my_struct elements[4][4]; } wrapper;

wrapper (*foo)(void); //OK
wrapper myfunc(void) 
{
   wrapper w;
   return w; // OK
}