我陷入了一些问题。
我需要写一些像memcpy(void*, const void*)
这样的函数,它的签名应该是:
void arrayCopy(void *dest, int dIndex, const void *src, int sIndex, int len)
我注意到,在memcpy
的许多实现中,我们将void *转换为char *,但我认为这不是我的情况,因为需要在数组上使用arrayCopy
函数包括structs
在内的多种类型。
那么,我该怎么做呢?
编辑: 源代码可能是这样的:
#include <stdio.h>
#include <string.h>
void arrayCopy(void *, int, const void *, int, int, size_t);
int main(void)
{
int i;
int dest[10] = {1};
int src [] = {2, 3, 4, 5, 6};
arrayCopy(dest, 1, src, 0, 5, sizeof(int));
for (i=0; i<10; i++) printf("%i\n", dest[i]);
return 0;
}
void arrayCopy(void *dest, int dIndex, const void *src, int sIndex, int len, size_t size)
{
char *cdest = (char*) dest;
const char *csrc = (char*) src;
int i;
len *= size;
if (dest == src)
{
printf("Same array\n");
}else
{
cdest += (dIndex * size);
csrc += (sIndex * size);
for (i=0; i<len; i++)
*cdest++ = *csrc++;
}
}
感谢。
答案 0 :(得分:2)
“char *”只是一堆字节,C中的所有内容最终都是字节 - 您可以将指向任何数据结构的指针转换为char *(您还需要知道结构的内存大小)
答案 1 :(得分:2)
该函数必须具有元素大小信息,例如:
void *arrayCopy(void *dest, size_t di,const void *src, size_t si, size_t num, size_t esize)
{
char *cdest = (char*) dest;
const char *csrc = (char*) src;
return memcpy( &cdest[esize*di], &csrc[esize*si], esize*num );
}
...
arrayCopy(dest, 1, src, 0, 5, sizeof*src);
答案 2 :(得分:2)
您无法使用void
类型的对象。标准不允许这样做。所以你需要抛弃虚空,最好使用的类型是unsigned char
。标准保证unsigned char
可以访问系统中可表示的任何其他类型的所有位。