Вы не можете назначить объект массива.
Как объявляются data1
, data2
, data3
и data4
?
void*
является (или может использоваться как) универсальным типом указателя. Это может дать вам огромную гибкость, но также может помешать проверке типа.
function_data
- массив из 4 указателей на void. В вызове some_function (function_data)
он неявно преобразуется в void**
, указатель на первый элемент.
some_function
ожидает void*
, а не void**
- но любой тип указателя (кроме указателя на функцию) может быть неявно преобразован в void*
, поэтому компилятор не будет жаловаться на вызов.
Вот версия вашей программы, которая, по крайней мере, верна (я думаю).
#include <stddef.h>
void some_function(void **data, size_t count);
int main(void) {
void **data1, **data2, **data3, **data4;
void *function_data[] = { *data1, *data2, *data3, *data4 };
some_function (function_data,
sizeof function_data / sizeof function_data[0]);
return 0;
}
void some_function(void **data, size_t count) {
size_t i;
for (i = 0; i < count; i ++) {
/*
* do something with data[i], which is of type void*
*/
}
}
Обратите внимание, что data1
и друзья не инициализированы, поэтому поведение этой программы не определено. Я подозреваю, что вы хотели написать что-то вроде:
void *function_data[] = { &data1, &data2, &data3, &data4 };
но трудно сказать, что вы пытаетесь сделать.
Если вам действительно требуется, чтобы функция имела копию массива, вы можете использовать memcpy()
(вы не можете назначать значения массива). Однако для большинства целей имеет больше смысла использовать указатели для доступа к исходному массиву. Вам нужно будет сделать копию, если вы хотите изменить копию, не затрагивая оригинал.
И я исправил объявления для main
и some_function
и добавил в верхнюю часть объявление для some_function
, чтобы оно было видно при его вызове.
Вы должны всегда явно объявлять тип возвращаемого значения для всех ваших функций. В версии C 1990 года вы можете опустить ее, и по умолчанию она будет int
(но все равно лучше явно объявить ее как int
). В версии C 1999 года тип является обязательным, и вы не можете вызывать функцию без видимого объявления.
Опять же, из кода, который вы нам показали, трудно понять, что именно вы пытаетесь сделать, из-за чего сложно догадаться, как это сделать.