首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >memmove()的代码

memmove()的代码
EN

Stack Overflow用户
提问于 2012-08-20 21:06:16
回答 2查看 4.9K关注 0票数 0

下面的代码片段显示了memmove()的实现。

代码语言:javascript
复制
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是:

代码语言:javascript
复制
 aabcdfgh  

为什么my_memmove()不能正常工作(它更改了my_str以便输出空字符串)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-20 21:09:01

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

代码语言:javascript
复制
for (i = 0; i != size; ++i)
    d[size - i - 1] = s[size - i - 1];

此外,附加条件s[i] &&看起来显然是错误的。

票数 5
EN

Stack Overflow用户

发布于 2013-01-29 13:21:42

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

代码语言:javascript
复制
...
char* d = (char*)dest;
char* s = (char*)src;

if( s > d )
...

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12038269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档