【发布时间】:2017-09-03 17:54:31
【问题描述】:
如果我有这样的多维数组:
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;
}
编辑:
一些 cmets 建议引用不是正确的词。当然,在 C 语言中,这是通过指针实现的。 所以这个问题的 TLDR 是:指向多维数组的指针类型的语法是什么样的。
在我的解决方法代码中已经可以看到答案。就是这样,继续前进,这里没什么可看的;)不过还是感谢您的回复。
【问题讨论】:
-
C中没有引用
-
您不能在结构中包含不完整的类型,除非结构末尾的 FAM 具有至少一个其他成员(因此您的
dummy成员)。而且,当您拥有 FAM 时,您必须动态分配具有正确内存量的结构。 -
在您的解决方法中,您的行
Foobar_t foobar = {(int*)testArr};可以更简洁地编写为Foobar_t foobar = { &testArr[0][0] };— 无需强制转换。第二个演员不是那么容易避免的。 -
@Filip Kočica:如果C中没有引用,那么
dereference operator *是干什么用的?
标签: c arrays pointers struct reference