如果我有一个多维数组这样的:多维阵列参考
int arr2d[2][3] = {{0,1,2}, {10,11,12}};
我可以将它传递给这样的功能:
void foobar(int arg[][3])
这不是由呼叫值,这是通过引用调用的,所以只是一个指向开始地址的指针,但编译器仍然知道它是一个二维数组,并且我可以像访问函数一样访问它。
现在如何在一个结构中工作?
typedef struct {
int arr2d[][3];
} Foobar_t
首先这给了我:error: flexible array member in otherwise empty struct
。我可以这样解决这个问题:
typedef struct {
int dummy;
int arr2d[][3];
} Foobar_t
它将编译没有错误或警告。但是,当我尝试使用它像Foobar_t foobar = {1337, arr2d}
我得到一些警告:
missing braces around initializer
initialization makes integer from pointer without a cast
和访问时:subscripted value is neither array nor pointer nor vector
。
一维数组很容易被视为指针。但对于多维数组,编译器需要知道不同维度的大小才能正确计算偏移量。有没有方法(int (*)[3])
和为什么语法不同于函数参数?
所以这是变通我想避免:
#include <stdio.h>
static int testArr[2][3] = {{0,1,2},{10,11,12}};
typedef struct {
int *arr2d;
} Foobar_t;
int main(int argc, char** argv) {
Foobar_t foobar = {(int*)testArr};
int (*arr2d)[3] = (int (*)[3]) foobar.arr2d;
printf("testStruct_0_0: %d\n", arr2d[0][0]);
printf("testStruct_1_0: %d\n", arr2d[1][0]);
return 1337;
}
编辑:
一些言论表明,引用不正确的单词。当然在C语言中,这是通过一个指针来实现的。 因此,这个问题的TLDR是:指针类型到多维数组的语法是怎样的。
答案已经可以在我的解决方法代码中看到。所有这一切,一起前进,没什么可看的;)尽管如此,谢谢你的回复。
有一个结构,只是为FAM在用C –
没有提到你不能有不完全类型至少有一个其他成员(因此是你的“虚拟”成员)的结构的结尾。当你有一个FAM时,你必须动态地分配正确数量的内存结构。 –
在你的解决方法中,你的代码行'Foobar_t foobar = {(int *)testArr};'可以写得更干净'Foobar_t foobar = {&testArr [0] [0]};' - 不需要强制转换。第二个演员不容易避免。 –