【发布时间】:2010-03-18 07:50:30
【问题描述】:
我有:
extern int docx(char *,char[][]) // in a header file
在solaris中编译正确,但在Redhat Linux中显示如下错误:
array type has incomplete element type.
我知道我可以解决它 - char[][20]
这是正确的方法吗?
【问题讨论】:
我有:
extern int docx(char *,char[][]) // in a header file
在solaris中编译正确,但在Redhat Linux中显示如下错误:
array type has incomplete element type.
我知道我可以解决它 - char[][20]
这是正确的方法吗?
【问题讨论】:
您必须知道函数实际期望什么,并相应地修改接口。如果它需要一个二维数组 (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"
【讨论】:
char *[M]
与char ** 没有什么不同。 char *[M] 是一个指向 char 的指针数组。维度在 C 中不起作用(在这种情况下)。 David 的意思是 char (*)[M],它是指向 M 字符数组的指针,这将是您的原型的正确类型 - 但您的 char [][M] 也很好(实际上它是更常见的公式)。
【讨论】: