Если включить некоторые предупреждения (которые вы всегда должны делать), вы получите:
main.cpp: In function 'main':
main.cpp:6:10: warning: passing argument 1 of 'func' from incompatible pointer type
func(data);
^
main.cpp:2:6: note: expected 'char ***' but argument is of type 'char * (*)[8]'
void func(char*** data) { (void)data; }
^
Который говорит вам именно то, что случилось, а именно, что массив не является указателем. Выделение указателя, который был преобразован в неправильный тип, является неопределенным поведением, поэтому вы можете вернуть что-либо обратно.
Имейте свою функцию взять в char *(*)[8]
, если вы хотите, чтобы придать ему char *(*)[8]
:
void func(char *(*data)[8]);
Или, если вы хотите, чтобы подчеркнуть, что data
должен указывать на первый элемент массива:
void func(char *data[][8]);
Два синтаксиса совершенно эквивалентны.
Примечание: файл имеет имя main.cpp
, но действительно скомпилирован в режиме C.
Включите предупреждения и повторите попытку. – this
2D-массив указателей, которые вы пытаетесь передать, не является символом 'char ***'. –