【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語言
+關注
關注
180文章
7598瀏覽量
136188 -
源碼
+關注
關注
8文章
633瀏覽量
29139 -
函數
+關注
關注
3文章
4306瀏覽量
62430
發布評論請先 登錄
相關推薦
java經典面試題深度解析
回答面試題Int 與Integer的區別第三節 以數據結構挖掘集合面試考點第四節 經典面試題重載與重寫第五節 如何回答面試官提問Java的接
發表于 06-20 15:16
c語言面試題,c++面試題下載
c語言面試題,c++面試題1. static有什么用途?(請至少說明兩種) 1) 限制變量的作用域 2) 設置變量的存儲域 2.&
發表于 10-22 11:19
?5次下載
評論