我有两个非常大的数组,我想只记忆不同的数据。问题是如果第二个数组中有零,它也会复制零并覆盖原始数据。问题是,零也是一个有效的数据项。我可以使用什么算法来记忆不同的数据?
我尝试了什么:
void *my_memcpy(void *dest, const void *src, size_t n)
{
char *dp = (char*) dest;
const char *sp = (char*) src;
while (n--)
{
if (*sp != 0)
*dp = *sp;
dp++;
sp++;
}
return dest;
}
int main()
{
int test[4] = {1, 2, 3, 4};
int test2[4] = {0, 0, 0, 5};
my_memcpy(test, test2, 4);
for (int i = 0; i < 4; ++i)
cout << test[i];
}
答案 0 :(得分:1)
有几个问题需要修复。
第一个问题是my_memcpy
一次只检查和复制一个char
,但您声明的要求只是复制非零int
值。要理解为什么这是一个问题,请考虑以下两个数组。
int test [4] = { 1, 2, 3, 4 };
int modified[4] = { 512, 0, 0, 0 };
在32位小端系统上,这些数组的内存看起来像这样
test 1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0
modified 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
调用my_memcpy( test, modified, sizeof(test) )
后,数组的内存将如下所示
test 1 2 0 0 2 0 0 0 3 0 0 0 4 0 0 0
请注意,my_memcpy
会将2
复制到数组的第二个位置,因为2
是修改后的数组中唯一的非零char
值。但是这会将输出数组保留为
int test[4] = { 513, 2, 3, 4 };
这不是你想要的。
第二个问题出在main()
函数中。您将值4
作为数组的大小传递。虽然4是数组中int
值的数量,但它不是数组的大小。该数组由16个char
值组成(在32位系统上)。因此,您必须确定您传递给my_memcpy
的大小是以字节为单位的大小,还是数组中的int数量
我建议的解决方案是重写my_memcpy
以使用int
指针。
int *my_int_cpy( int *dest, const int *src, size_t count )
{
while (count--)
{
if (*src != 0)
*dest = *src;
dest++;
src++;
}
return dest;
}
int main()
{
int test[] = {1, 2, 3, 4};
int test2[] = {512, 0, 0, 5};
int count = sizeof(test)/sizeof(test[0]);
my_int_cpy( test, test2, count );
for (int i = 0; i < count; ++i)
printf( "%d\n", test[i] );
}