If you enable some warnings (which you should always do), you'll get :
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; }
^
Which tells you exactly what's wrong, namely that an array is not a pointer. Dereferencing a pointer that has been converted to the wrong type is undefined behaviour, so you can get anything back.
Have your function take in a char *(*)[8] if you want to give it a char *(*)[8] :
void func(char *(*data)[8]);
Or, if you want to emphasize that data should point to the first element of an array :
void func(char *data[][8]);
The two syntaxes are perfectly equivalent.
Note : the file is named main.cpp but is indeed compiled in C mode.
char ***.