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);