【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 fi echo $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语言经典面试题】源码实现标准库函数memcpy-c语言标准库函数大全 https://www.yhzz.com.cn/a/7110.html