Ваш компилятор должен был дать вам предупреждение, которое дает хорошую подсказку.
k.c:12:19: warning: passing argument 1 of ‘longestConsec’ from incompatible pointer type [-Wincompatible-pointer-types]
12 | longestConsec(string, 8);
| ^~~~~~
| |
| char (*)[14]
k.c:2:26: note: expected ‘char **’ but argument is of type ‘char (*)[14]’
2 | void longestConsec(char* strarr[], int n) {
| ~~~~~~^~~~~~~~
string
- это массив массивов, char[8][14]
и strarr
- указатель на указатель на char, char **
. Когда string
передается функции, она распадается до указателя на массив из 14 символов, char (*)[14]
. Передача многомерных массивов функциям может быть сложной, но это работает:
// size_t is better than int in this case
void longestConsec(size_t len, char strarr[][len], size_t n)
{
for(int i=0; i<n; i++)
printf("%s\n",strarr[i]);
}
И затем вызовите его с помощью:
longestConsec(sizeof string[0]/sizeof string[0][0], // 14
string,
sizeof string/sizeof string[0] // 8
);
Обратите внимание, что вы можете написать sizeof string[0]
вместо sizeof string[0]/sizeof string[0][0]
но это потому, что sizeof char
всегда равно 1.
Понимание этих объявлений может быть немного сложным. Просто чтобы дать типовой пример того, как они объявлены:
char (*arr)[10]; // arr is a pointer to array of char of size 10
char *arr[10]; // arr is an array of 10 pointers to char
Связано: массивы не являются указателями, а указатели не являются массивами