C: правильно использовать арифметику указателей с void *

Предположим, у меня есть обертка вокруг функции memcpy-esque.

В memcpyподпись функции (void *, void *, size_t size) где size = n_elements * sizeof(element),

Я хотел бы, чтобы мой упаковщик также взял (void * dest, void * src, size_t size), Однако внутри оболочки я делаю такие вещи, как загрузка src массив в буфер, а затем скопировать буфер на dest,

Для этого я использую арифметику указателей с void *:

for(i = 0; i < size - buffsize; i += buffsize)
   memcpy(buff,src + i*buffsize, buffsize);

Тем не менее, компилятор жалуется, что src это void * указатель, и я не могу использовать арифметику указателя на void *,


Но пока void * указатель на кусок данных длины 1 byteмой код должен работать как положено, верно? Как правильно справиться с такой ситуацией, чтобы компилятор не жаловался?

3 ответа

Решение

Использовать (signed/unsigned) char* для арифметики указателей:

for (i = 0; i < size - buffsize; i += buffsize)
    memcpy(buff, ((char*)src) + i * buffsize, buffsize);

Символьному указателю разрешено псевдоним любого типа, поэтому его можно преобразовать в unsigned char * работа работа с теми.

unsigned char *char_dest = dest;
unsigned char *char_src = src;
...

Однако компилятор жалуется, что src является указателем void *, и я не могу использовать арифметику указателей для void *

Примени это char* первый.

char* temp_src = (char*)src;
for(i = 0; i < size - buffsize; i += buffsize)
   memcpy(buff, temp_src + i*buffsize, buffsize);
Другие вопросы по тегам