Тип void
не имеет размера. Поэтому вы не можете использовать void *
для очистки массива.
Вы не можете разыменовать этот тип по той же причине.
Вы должны привести к указателю с определенным типом:
void clean_buffer(void *ptr, size_t n)
{
unsigned char *my_ptr = ptr;
for (int i = 0; i < n; i++)
my_ptr[i]=0;
}
Вам нужно позаботиться о том, чтобы размер, передаваемый вашей функции, не мог быть числом или массивами, потому что компилятор не может выполнять арифметику указателей с void*
указателями.
А для размеров следует использовать size_t
Вместо этого вы должны передать размер массива в байтах:
int main(void)
{
float *pf;
int *pi;
pf = malloc(10*sizeof(float));
pi = malloc(10*sizeof(int));
clean_buffer( pf, 10*sizeof(float));
clean_buffer( pi, 10*sizeof(int));
return 0;
}
Или вам нужно передать любую другую информацию, которая может использоваться для определения типа и / или размера данных.
Также:
Приведение возвращаемого значения malloc
не требуется в C.
Преобразование параметров clean_buffer
в тип, который уже есть в переменной, бесполезно. В любом случае тип указателя преобразуется в void *
, поскольку это то, что ожидает функция.
Примечание:
В других ответах и комментариях упоминается, что вы можете просто передать указатель на memset
или использовать calloc
и т. Д.
Это может быть верно для этого очень специфического случая, но если вы хотите сделать что-то еще, кроме простого обнуления памяти, применяются те же аспекты в отношении указателей void *
, как я показал здесь. И в этих случаях memset
или calloc
не помогают.