Предупреждение совершенно верно. Ваша функция хочет массив указателей. Вы даете ему массив массивов.
Ожидаемое:
sep_foo:
+------+ +-----+
|char**|--> 0: |char*|-->"string1"
+------+ +-----+
1: |char*|-->"string2"
+-----+
*sep_foo_qty-1: |... |
+-----+
Что вы предоставили:
sep_foo:
+--------------------------------+
0: | char[MAX_STRING_LENGTH] |
+--------------------------------+
1: | char[MAX_STRING_LENGTH] |
+--------------------------------+
MAX_QTY-1: | ... |
+--------------------------------+
Массив с элементами типа X
может "распадаться" на указатель на X
или X*
. Но значение X
не может измениться в этом преобразовании. Допускается только операция распада одна . Вам нужно, чтобы это произошло дважды. В вашем случае X
- это массив из MAX_STRING_LENGTH
символов. Функция хочет, чтобы X
был указателем на символ. Поскольку это не одно и то же, компилятор предупреждает вас. Я немного удивлен, что это было просто предупреждение, так как ничего не может быть получено из того, что компилятор допустил.
В вашей функции вы можете написать этот код:
char* y = NULL;
*sep_foo = y;
Это юридический код, поскольку sep_foo
- это char**
, поэтому *sep_foo
- это char*
, а также y
; Вы можете назначить их. Но с тем, что вы пытались сделать, *sep_foo
не будет на самом деле будет char*
; это будет указывать на массив символов. Ваш код, по сути, будет пытаться сделать это:
char destination[MAX_STRING_LENGTH];
char* y = NULL;
destination = y;
Вы не можете назначить указатель на массив, и поэтому компилятор предупреждает, что вызов не годится.
Есть два способа решить эту проблему:
Измените способ, которым вы объявляете и выделяете sep_foo
на вызывающей стороне, чтобы он соответствовал тому, что функция ожидает получить:
char** sep_foo = calloc(MAX_QTY, sizeof(char*));
for (int i = 0; i < MAX_QTY; ++i)
sep_foo[i] = malloc(MAX_STRING_LENGTH);
или, что эквивалентно
char* sep_foo[MAX_QTY];
for (int i = 0; i < MAX_QTY; ++i)
sep_foo[i] = malloc(MAX_STRING_LENGTH);
Измените прототип функции, чтобы принять то, что вы на самом деле ей даете:
int parse(const char *foo, char sep_foo[MAX_QTY][MAX_STRING_LENGTH], int *sep_foo_qty);