【问题标题】:Code of memmove()memmove() 的代码
【发布时间】:2012-08-20 13:06:16
【问题描述】:

下面的代码sn-p显示了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;
}

我得到output 为:

 aabcdfgh  

为什么 my_memmove() 不能正常工作(它改变了 my_str 使其输出空字符串)?

【问题讨论】:

  • 这必须是家庭作业,因为这是迄今为止该问题的第二份副本。同时,你到底为什么要在这里比较 > 或
  • 另外,为什么用s[i] 进行空检查?你已经有了尺码。
  • @bmargulies 它会影响循环的方向。 memmove 必须防止内存重叠。
  • 使用 s[i] 进行空值检查来处理过大的尺寸。如果 size 是 50 怎么办?
  • @Aashish:nothing 可以处理错误的函数参数。如果您的用户想要破坏您的代码,他们可以。记录您的功能,让您的用户担心正确使用它。

标签: c memmove


【解决方案1】:

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

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

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

【讨论】:

  • 也可以写成while (size--) d[size] = s[size];
【解决方案2】:

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

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

if( s > d )
...

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

这非常非常糟糕,使用内置的 memmove() 即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2018-09-02
    相关资源
    最近更新 更多