在下面的示例中,我不明白为什么会出现此错误:
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;
}
我该如何解决?
答案 0 :(得分:3)
您只能在最左侧省略尺寸,即您可以
long foo[][3] = { { 2, 3, 4 }, { 5, 6 ,7 } };
但不是像你试过的那样。它根本不受支持,可能是因为检查所有子阵列的长度是否相同被认为是昂贵的,或者其他什么。
对于第二个问题,您在错误中获得*
的事实应该会导致您删除呼叫中的&
。你想要子数组,它会衰减到指向第一个元素的指针,而不是指向数组的指针。
另外,请记住sizeof
返回char
s的大小,因此对于数组,您需要缩小:
bar(foo[0], sizeof foo[0] / sizeof foo[0][0]);
答案 1 :(得分:2)
这里,编译器应该考虑一个完整的类型,即[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,size_t size)
这是因为您传递的类型与bar
期望不匹配。我个人的选择是使用:
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?
答案 2 :(得分:0)
是的,下面的代码不能编译为:
long foo[][3] = {
{2,3,4},
{5,6,7}
};
宣布' foo'因为多维数组必须具有除第一个之外的所有维度的边界 long foo [2] [] = {
您可以成功编译以下代码:
long foo[2][3] = {
{2,3,4},
{5,6,7}
};
^
我能够成功编译以下代码:
$pattern = "/My name is '(.*)' and im fine/";
$pattern = "#My name is '(.*)' and im fine#";
$pattern = "@My name is '(.*)' and im fine@";