0

下面的代码片段显示了memmove().

void my_memmove(void* dest, const void* src, size_t size)
{
    unsigned int i;

    char* d = (char*)dest;
    char* s = (char*)src;

    if( s > d )
    {
            for( i = 0; s[i] && i < size; ++i )
                    d[i] = s[i];
    }
    else
            for( i = size-1; d[i] && i >= 0; --i )
                    d[i] = s[i];
}

int main()
{
    char my_str[] = "abcdefgh";

    char str[] = "abcdefgh";

    my_memmove(my_str+1, my_str, 4);

    memmove(str+1, str, 4);

    printf("%s %s\n", my_str, str);

    return 0;
}

我得到的输出为:

 aabcdfgh  

为什么 my_memmove() 无法正常工作(它更改了 my_str 使其输出空字符串)?

4

2 回答 2

5

对于无符号整数,条件i >= 0始终为真。最好用“-1”反转偏差编写惯用循环:

for (i = 0; i != size; ++i)
    d[size - i - 1] = s[size - i - 1];

此外,附加条件s[i] &&看起来完全错误。

于 2012-08-20T13:09:00.510 回答
1

您假设 src 和 dest 指向同一内存块中的点。

...
char* d = (char*)dest;
char* s = (char*)src;

if( s > d )
...

这意味着如果有人使用 src 和 dest 指向内存中的 2 个不同位置调用您的函数,您将获得未定义的行为。

这非常非常糟糕,只需使用内置的 memmove()。

于 2013-01-29T05:21:41.630 回答