Ошибка C Массив: тип массива имеет неполный тип элемента. - PullRequest
7 голосов
/ 18 марта 2010

у меня есть:

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

Он правильно скомпилирован в Solaris, но в Redhat Linux он показывает ошибку ниже:

array type has incomplete element type.

Я знаю, что могу решить это как - char[][20]

Это правильный путь?

Ответы [ 2 ]

17 голосов
/ 18 марта 2010

Вы должны будете знать, чего на самом деле ожидает функция, и соответственно изменить интерфейс. Если он ожидает двумерный массив (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"
2 голосов
/ 18 марта 2010

char *[M] ничем не отличается от char **. char *[M] это массив указателей на символ. Размерность не играет никакой роли в C (в этом случае). Дэвид имел в виду char (*)[M], который является указателем на массив из M символов, который будет правильным типом для вашего прототипа, но ваш char [][M] тоже подойдет (на самом деле это более распространенная формулировка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...