【C語言經(jīng)典面試題】源碼實(shí)現(xiàn)標(biāo)準(zhǔn)庫函數(shù)memcpy
你有面試中,要求寫memcpy的源碼實(shí)現(xiàn)嗎?本文給出一個參考寫法!
1 需求說明2 源碼實(shí)現(xiàn)2.1 函數(shù)申明2.2 功能實(shí)現(xiàn)3 源碼測試4 小小總結(jié)
1 需求說明
題目大意如下:
請參考標(biāo)準(zhǔn)C庫對memcpy的申明定義,使用C語言的語法寫出其實(shí)現(xiàn)源碼。
2 源碼實(shí)現(xiàn)
2.1 函數(shù)申明
通過查看man幫助,我們可以知道m(xù)emcpy函數(shù)的功能及其簡要申明。
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 功能實(shí)現(xiàn)
以下是我的一個簡單實(shí)現(xiàn)源碼,僅供參考:
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
執(zhí)行編譯后,運(yùn)行小程序的結(jié)果:
c_c++/memmove$ ./test
before-memcpy-buf: 123451239abcdef
after-memcpy-buf: 123451239abcdef
?
before-memcpy-buf: 12345123451239f
after-memcpy-buf: 12345123451234f
?
從運(yùn)行結(jié)果上看,基本滿足了題目要求,有心的讀者可以進(jìn)一步測試其他測試用例。
4 小小總結(jié)
memcpy的源碼實(shí)現(xiàn),核心就是內(nèi)存拷貝分,盡管它和memmove的接口原型是一樣的,但是它們實(shí)現(xiàn)的功能還是有本質(zhì)區(qū)別的,你都get到了嗎?
審核編輯:湯梓紅
-
C語言
+關(guān)注
關(guān)注
180文章
7608瀏覽量
137119 -
源碼
+關(guān)注
關(guān)注
8文章
647瀏覽量
29281 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4338瀏覽量
62740
發(fā)布評論請先 登錄
相關(guān)推薦
評論