memcpy只有不同的数据

时间:2014-09-22 16:47:51

标签: c

我有两个非常大的数组,我想只记忆不同的数据。问题是如果第二个数组中有零,它也会复制零并覆盖原始数据。问题是,零也是一个有效的数据项。我可以使用什么算法来记忆不同的数据?

我尝试了什么:

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];
}

1 个答案:

答案 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] );
}