我有:
extern int docx(char *,char[][]) // in a header file
它在solaris中正确编译,但在Redhat Linux中它显示错误:
array type has incomplete element type.
我知道我可以解决它 - char[][20]
这是正确的方法吗?
答案 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]
也很好(事实上它是更常见的公式)。