Посмотрите ваше заявление
cur_a = (unsigned char *)*a + i; // here
если a
является указателем к мочеиспусканию (void *a
), то *a = void
. Затем подвыражение (unsigned char *)*a
означает, что вы хотите наложить void
на указатель на символ.
Но void
означает 'inexistent type' в C, из-за этого ошибки. Вы можете спросить, почему вместо этого указатель на пустоту имеет смысл, это имеет смысл, потому что это адрес, который является допустимым типом данных в C. Вы можете использовать адрес для всех операций, которые не связаны с указанным типом. То есть присвоение адреса указателю на любой тип данных и наоборот, является законным. Недопустимо выражение, например a[2]
, где оператору []
нижнего индекса нужен размер данных, указывающих на вычисление адреса, где можно получить значение.Конечно, void
, как фиктивный тип, не имеют размера (так же, как он пропускает многие другие свойства).
сказал, что я бы к выводу, что это была просто ошибка в коде, и то, что вы действительно хотите сделать это:
void ft_swap(void *a, void *b, size_t nbytes)
{
unsigned char cur_a; //value not pointers
unsigned char cur_b;
size_t i;
i = 0;
while (i < nbytes)
{
cur_a = *((unsigned char *)a + i); // here
cur_b = *((unsigned char *)b + i); // here
*a = cur_b;
*b = cur_a;
i++;
}
}
обычно, то есть предупреждение компилятора с номером строки, указывающим на точно линии, где это происходит. –