Я имею:
extern int docx(char *,char[][]) // in a header file
Это компилируется правильно в solaris, но в Redhat Linux это показывает ошибочный рев:
array type has incomplete element type.
Я знаю, что могу решить его как - char[][20]
Действительно ли это - правильный путь?
char *[M]
ничем не отличается от char **
. char *[M]
- это массив указателей на char. Размерность не играет никакой роли в C (в данном случае). Дэвид имел в виду char (*)[M]
, который является указателем на массив из M символов, что было бы правильным типом для вашего прототипа - но ваш char [][M]
тоже подходит (на самом деле это более распространенная формулировка).
Вам нужно будет знать, что функция фактически ожидает, и соответствующим образом изменить интерфейс. Если ожидается двумерный массив ( 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"