C error数组:数组类型具有不完整的元素类型。

时间:2010-03-18 07:50:31

标签: c arrays

我有:

extern int docx(char *,char[][]) // in a header file

它在solaris中正确编译,但在Redhat Linux中它显示错误:

array type has incomplete element type.

我知道我可以解决它 - char[][20]

这是正确的方法吗?

2 个答案:

答案 0 :(得分:17)

您必须知道函数实际期望的内容并相应地修改接口。如果它期望一个二维数组(char [N][M]),那么正确的接口将是:

extern int docx(char *,char*[M]);

不同于:

extern int docx( char*, char** );

在第一种情况下,函数将期望指向一个连续的内存块,该内存块包含N*M个字符(&p[0][0]+M == &p[1][0](void*)&p[0][0]==(void*)&p[0]),而在第二种情况下,它将是期望指向一个内存块的指针,该内存块保存N指向可能或不连续的内存块的指针(&p[0][0]&p[1][0]不相关且p[0]==&p[0][0]

// case 1
ptr ------> [0123456789...M][0123.........M]...[0123.........M]

// case 2
ptr ------> 0 [ptr] -------> "abcde"
            1 [ptr] -------> "another string"
              ...
            N [ptr] -------> "last string"

答案 1 :(得分:2)

char *[M]char **没有什么不同。 char *[M]是一个指向char的指针数组。维度在C中不起作用(在这种情况下)。大卫的意思是char (*)[M],这是一个M字符数组的指针,它是你的原型的正确类型 - 但是你的char [][M]也很好(事实上它是更常见的公式)。