【问题标题】:memcpy rewrite not working [closed]memcpy重写不起作用[关闭]
【发布时间】:2018-05-29 10:38:01
【问题描述】:

您好,谁能解释一下为什么这个 memcpy 函数不起作用?

void    *ft_memcpy(void *dst, const void *src, size_t n)
{    
        while (n--)
                *(char *)dst++ = *(char *)src++;
        return (dst);
}

【问题讨论】:

  • 这在哪些方面“不起作用”?
  • @andreee 实际上它正在返回一个空指针
  • 您的 dst++src++ 构成了 void * 上的指针运算,这是非标准的,尽管 GNU gcc 作为扩展支持。
  • 您是否注意到零是size_t 类型的合法值...?
  • 两个问题:它不是有效的 C,因为 ++ 的优先级高于强制转换,并且您不能在 void 指针上使用 ++。此外,您需要返回指向数据开头的指针,而不是结尾。

标签: c memory-management memcpy


【解决方案1】:

该代码甚至不应该编译;它肯定不符合 C.

void 指针上的算术未定义 - 您应该做的是创建可以从中复制的 char 指针。请记住返回目标缓冲区的开始,而不是结束:

#include <stdlib.h>             /* for size_t */

void *ft_memcpy(void *restrict dst, const void *restrict src, size_t n)
{
    char *d = dst;
    const char *s = src;

    while (n--)
        *d++ = *s++;

    return dst;
}

顺便说一句,请注意,好的编译器有权识别此复制循环并将其优化为标准库 memcpy() 的调用。

【讨论】:

  • 不,应该做的是删除整个东西并直接使用memcpy()。即使您设法正确地重新实现某些标准功能,它也可能比现有功能慢。如果你未能正确地重新实现它,就会发生各种有趣的事情。
  • 是的 - 但它有助于理解原始函数有什么问题,因为有时您需要与标准函数相似但略有不同的东西。
  • 是的,但是,正如您所提到的(并且 gcc 经常这样做),编译器只是将其优化回标准库 memcpy()。让为自己的 min libc 编写 memcpy() 变得有趣,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多