Массивы распадаются на указатели на свои первые элементы, и указатели на любой тип могут быть неявно приведены к void*
. Во-вторых, для правильной работы доступа к массиву FetchValueArray
необходимо знать, насколько велик каждый элемент массива. Вы пытаетесь передать void**
, который является указателем на void*
, поэтому доступ к массиву обрабатывает каждый элемент так, как если бы он имел размер void*
, что неверно - ваши элементы массива имеют размер int
, который не обязательно совпадает с размером void*
.
Так что void**
не так. Вместо этого вам нужно ввести void*
, что означает «указатель на неизвестный тип». Вы не можете использовать индексирование массива для void*
, так как компилятор не знает размер базового указательного типа. Вы должны помочь этому. Например:
bool FetchValueArray(char* source, char* name, char* typeFormat, int count, void* destination, size_t destElementSize)
{
...
sscanf(t, typeFormat, (char*)destination + destElementSize * i);
...
}
...
FetchValueArray(source, "CONFIG=", "%d", 15, vals, sizeof(vals[0]));
Здесь мы выполняем индексацию массива вручную - мы приводим void*
к char*
, который имеет известный размер, указывающий на (1 байт), а затем выполняем смещение массива путем умножения на размер каждого элемента. Результатом является указатель на правильную ячейку памяти, чего ожидает sscanf
.
Будьте здесь очень осторожны - я думаю, вам следует пересмотреть свой дизайн. Компилятор не знает семантику вашей функции, поэтому он не может проверить, что вы передаете правильные аргументы. Очень легко вставить случайную уязвимость безопасности, не осознавая этого здесь. Подумайте, может быть, вам лучше использовать другой дизайн, который компилятор сможет проверить более тщательно.