memset 、 memcpy 、 memmove 、 strcpy、 strlen
方法的實現整理。
在標頭檔案中宣告的記憶體管理函式原型如下:
void *memcpy (void *, const void *, size_t);
:從源記憶體位址的起始位置開始拷貝若干個位元組到目標記憶體位址中,引數分別為:(void *dest, void *src, size_t n),將src所指的記憶體位址的起始位置開始拷貝n個位元組到目標dest所指的記憶體位址的起始位置中。
void *memset (void *, int, size_t);
:在一段記憶體塊中填充某個給定的值,引數分別為:(void *s, int ch, size_t n),將s中當前位置後面的n個位元組用ch替換並返回s。它是對較大的結構體或陣列進行清零操作的一種最快方法。
void *memmove (void *, const void *, size_t);
:拷貝位元組,如果目標區域和源區域有重疊的話,能夠保證源在被覆蓋之前將重疊區域的位元組拷貝到目標區域中,但複製後源內容會被更改,引數分別為:(void* dest, const void* src, size_t count),由src所指記憶體區域複製count個位元組到dest所指記憶體區域。當目標區域與源區域沒有重疊則和memcpy函式功能相同。
在標頭檔案中宣告的字串處理函式原型如下:
char *strcpy (char *, const char *);
:把含有』\0』結束符的字串複製到另乙個位址空間,引數分別為:(char* dest, const char *src),把從src位址開始且含有null結束符的字串複製到以dest開始的位址空間。
size_t strlen (const char *)
:計算給定字串的長度,不包括』\0』在內。
函式功能的實現
1. memcpy
void
*memcpy
(void
*dest,
const
void
*src, size_t count)
這樣實現存在的乙個問題是,如果dest指標所指的區域和src指標所指的區域重疊的話,函式功能不能正確執行,所以會使用restrict
關鍵字來限定這兩個引數,void *memcpy( void * restrict dest , const void * restrict src, size_t n)
。改進思路:可先進行位址對齊後,按照cpu字長進行拷貝。
2. memmove
void
*memmove
(void
*dest,
const
void
*src, size_t count)
else
return dest;
}
memmove
在copy兩個有重疊的記憶體時能正確執行,且memcpy
比memmove
的速度要快一些。
3. memset
void
*memset
(void
*dest,
int ch, size_t n)
1. strlensize_t strlen
(const
char
*s)
如上單字元的計算效率太低,改進思路1:從字串的兩端同時開始計算。
2. strcpy
char
*strcpy
(char
*dest,
const
char
*src)
改進後的實現:
#include
char
*strcpy
(char
*dest,
const
char
*src)
while
(c !=
'\0');
return dest;
}
references: string h常用庫函式
strcpy 函式名 strcpy 功 能 拷貝乙個字串到另乙個 用 法 char strcpy char destin,char source 程式例 include include int main void strncpy 函式名 strncpy 原型 char strncpy char de...
memcmp函式實現 string h庫函式
memcmp 3 linux programmer s manual memcmp 3 name memcmp compare memory areas synopsis include int memcmp const void s1,const void s2,size t n descript...
C語言string h常用函式總結
從源src所指的記憶體位址的起始位置開始拷貝n個位元組到目標dest所指的記憶體位址的起始位置中.由src所指記憶體區域複製count個位元組到dest所指記憶體區域。memmove用於從src拷貝count個字元到dest,如果目標區域和源區域有重疊的話,memmove能夠保證源串在被覆蓋之前將重...