long foo [2] []中的不完整类型元素

时间:2016-05-13 09:58:02

标签: c struct

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

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;
}       

我该如何解决?

3 个答案:

答案 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@";