C ошибочный Массив: тип массива имеет неполный тип элемента.

Я имею:

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

Это компилируется правильно в solaris, но в Redhat Linux это показывает ошибочный рев:

array type has incomplete element type.

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

Действительно ли это - правильный путь?

7
задан Iulius Curt 30 March 2012 в 09:20
поделиться

2 ответа

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

2
ответ дан 6 December 2019 в 09:59
поделиться

Вам нужно будет знать, что функция фактически ожидает, и соответствующим образом изменить интерфейс. Если ожидается двумерный массив ( 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"
17
ответ дан 6 December 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: