0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【C语言经典面试题】源码实现标准库函数memcpy

嵌入式物联网开发 来源:嵌入式物联网开发 作者:嵌入式物联网开发 2022-09-30 17:12 次阅读

C语言经典面试题】源码实现标准库函数memcpy

你有面试中,要求写memcpy的源码实现吗?本文给出一个参考写法!

1 需求说明2 源码实现2.1 函数申明2.2 功能实现3 源码测试4 小小总结

1 需求说明

题目大意如下:

请参考标准C库对memcpy的申明定义,使用C语言的语法写出其实现源码。

2 源码实现

2.1 函数申明

通过查看man帮助,我们可以知道memcpy函数的功能及其简要申明。

NAME
       memcpy - copy memory area
​
SYNOPSIS
       #include void *memcpy(void *dest, const void *src, size_t n);
​
DESCRIPTION
       The memcpy() function copies n bytes from memory area src to memory area dest.  The memory areas must not overlap.  Use memmove(3) if the memory
       areas do overlap.
​
RETURN VALUE
       The memcpy() function returns a pointer to dest.

2.2 功能实现

以下是我的一个简单实现源码,仅供参考:

char *my_memcopy(char* dest, const char *src, size_t len)
{
    assert(dest && src && (len > 0));

if (dest == src) {
;
} else {
        char *p = dest;
size_t i;
        for (i = 0; i < len; i++) {
            *p++ = *src++;
}
    } 
​
    return dest;
}

3 源码测试

简单的测试代码如下:

#include 
#include int main(void)
{
    char buf[30] = "123456789abcdef";

printf("before-memcpy-buf: %s
", buf);
    my_memcopy(buf + 5, buf, 3);
printf("after-memcpy-buf: %s
", buf);
​
printf("before-memcpy-buf: %s
", buf);
    my_memcopy(buf + 5, buf, 9);
printf("after-memcpy-buf: %s
", buf);
​
return 0;
}
​

简单写了build.sh脚本做编译测试:

#! /bin/bash -e
​
CFLAGS="-Wall -Werror"
cmd="gcc *.c $CFLAGS -o test"if [ "$1" = "clean" ]; then
    rm -rf test
    echo "Clean build done !"
    exit 0
fiecho $cmd && $cmd

执行编译后,运行小程序的结果:

c_c++/memmove$ ./test 
before-memcpy-buf: 123451239abcdef
after-memcpy-buf: 123451239abcdef
​
before-memcpy-buf: 12345123451239f
after-memcpy-buf: 12345123451234f
​

从运行结果上看,基本满足了题目要求,有心的读者可以进一步测试其他测试用例。

4 小小总结

memcpy的源码实现,核心就是内存拷贝分,尽管它和memmove的接口原型是一样的,但是它们实现的功能还是有本质区别的,你都get到了吗?

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128565
  • 源码
    +关注

    关注

    8

    文章

    573

    浏览量

    28585
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61308
收藏 人收藏

    评论

    相关推荐

    【C语言进阶】面试题:请使用宏定义实现字节对齐

    【C语言进阶】面试题:请使用宏定义实现字节对齐
    的头像 发表于 07-11 09:21 2354次阅读
    【C<b class='flag-5'>语言</b>进阶】<b class='flag-5'>面试题</b>:请使用宏定义<b class='flag-5'>实现</b>字节对齐

    经典面试题】请使用C语言编程实现对IPV4地址的合法性判断

    经典面试题】请使用C语言编程实现对IPV4地址的合法性判断
    的头像 发表于 05-16 15:23 1132次阅读

    C语言面试题大全

    C语言面试题大全{:1:}{:2:}{:1:}{:1:}{:1:}{:1:}
    发表于 04-10 20:51

    java经典面试题深度解析

    回答面试题Int 与Integer的区别第三节 以数据结构挖掘集合面试考点第四节 经典面试题重载与重写第五节 如何回答面试官提问Java的接
    发表于 06-20 15:16

    C语言 经典面试题

    C语言经典面试题目.doc
    发表于 08-05 22:03

    12个常见的C语言面试题

    12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存
    发表于 12-31 06:36

    c语言面试题

    c语言面试题集(单片机)C language problem(20151125084232)
    发表于 12-18 14:05 8次下载

    c语言面试题

    c语言面试题
    发表于 11-05 16:48 0次下载

    C语言经典面试题

    面试题
    发表于 12-20 22:41 0次下载

    C语言经典面试题

    C语言 经典面试题
    发表于 01-05 11:27 0次下载

    经典硬件面试题精选及解答

    经典硬件面试题精选及解答
    发表于 11-29 18:02 0次下载

    【C语言经典面试题】sizeof与strlen有什么区别?

    这道经典面试题,我来跟你一起聊一聊。
    的头像 发表于 10-05 16:30 1809次阅读
    【C<b class='flag-5'>语言</b><b class='flag-5'>经典</b><b class='flag-5'>面试题</b>】sizeof与strlen有什么区别?

    【C语言经典面试题函数指针数组的定义是怎么样的?

    经典面试题,有必要了解下!
    的头像 发表于 10-05 16:35 1977次阅读
    【C<b class='flag-5'>语言</b><b class='flag-5'>经典</b><b class='flag-5'>面试题</b>】<b class='flag-5'>函数</b>指针数组的定义是怎么样的?

    【C语言经典面试题】static关键字的作用有哪些?

    经典面试题,有必要了解下!
    的头像 发表于 10-02 12:00 2377次阅读
    【C<b class='flag-5'>语言</b><b class='flag-5'>经典</b><b class='flag-5'>面试题</b>】static关键字的作用有哪些?

    【C语言经典面试题】求数组元素的个数的宏定义

    经典面试题,有必要了解下!
    的头像 发表于 10-02 11:58 2834次阅读
    【C<b class='flag-5'>语言</b><b class='flag-5'>经典</b><b class='flag-5'>面试题</b>】求数组元素的个数的宏定义