在下面的示例中,我不明白为什么会出现此错误:

test.c:3:6: error: array type has incomplete element type

这里,编译器应该考虑一个完整的类型,即[2][3],因为每个子元素的大小都是3。那么,问题在哪里?
long foo[2][] = {
    {2,3,4},
    {5,6,7}
};

如果我使用foo[2][3]完成类型,将得到以下错误:
test.c:9:5: note: expected ‘long int *’ but argument is of type ‘long int (*)[3]’
 int bar(long* list, size_t size)

使用此示例:
int bar(long* list, size_t size);

int main() {
    bar(&foo[0], sizeof(foo[0]));
    return 0;
}

我怎样才能修好它?

最佳答案

在这里,编译器应该考虑一个完整的类型,即[2][3],因为每个子元素的大小都是3。那么,问题在哪里?
如果你喜欢的话:

long foo[2][] = {
    {2,3,4},
    {5,7}
};

在这种情况下编译器应该做什么?是[2][2]还是[2][3]
在C语言中,只能省略数组最左边的维度。所以,你可以:
long foo[][3] = {
    {2,3,4},
    {5,6,7}
};

相关职位:why c/c++ allows omission of leftmost index of a multidimensional array in a function call?
注意:应为“long int”,但参数的类型为“long int()[3]”
整数条(长*列表,大小)
这是因为您传递的类型与预期的类型不匹配。我个人的选择是:
int bar(long (*list)[3], size_t size) {

}

打电话给:
bar(foo, sizeof foo/sizeof foo[0]);

但也有其他办法。见:How to pass 2D array (matrix) in a function in C?

关于c - 长foo [2] []中的类型元素不完整,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37206957/

10-12 14:12
查看更多