詳解C語(yǔ)言中的memset()函數(shù)
C語(yǔ)言memset()函數(shù):將內(nèi)存的前n個(gè)字節(jié)設(shè)置為特定的值
頭文件:
#include <string.h>
memset() 函數(shù)用來(lái)將指定內(nèi)存的前n個(gè)字節(jié)設(shè)置為特定的值,其原型為:
void * memset( void * ptr, int value, size_t num );
參數(shù)說(shuō)明:
ptr 為要操作的內(nèi)存的指針。
value 為要設(shè)置的值。你既可以向 value 傳遞 int 類型的值,也可以傳遞 char 類型的值,int 和 char 可以根據(jù) ASCII 碼相互轉(zhuǎn)換。
num 為 ptr 的前 num 個(gè)字節(jié),size_t 就是unsigned int。
【函數(shù)說(shuō)明】memset() 會(huì)將 ptr 所指的內(nèi)存區(qū)域的前 num 個(gè)字節(jié)的值都設(shè)置為 value,然后返回指向 ptr 的指針。
memset() 可以將一段內(nèi)存空間全部設(shè)置為特定的值,所以經(jīng)常用來(lái)初始化字符數(shù)組。例如:
char str[20]; memset(str, '\0', sizeof(str)-1);
【返回值】返回指向 ptr 的指針。
注意:參數(shù) value 雖聲明為 int,但必須是 unsigned char,所以范圍在0 到255 之間。
范例:
復(fù)制純文本新窗口
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { // 不可以聲明為 char *str = "http://c.biancheng.net"; char str[] = "http://c.biancheng.net"; memset(str, '-', 7); puts(str); system("pause"); return EXIT_SUCCESS; }
執(zhí)行結(jié)果:
-------c.biancheng.net
memmove 和 memcpy的區(qū)別
memcpy和memmove()都是C語(yǔ)言中的庫(kù)函數(shù),在頭文件string.h中,作用是拷貝一定長(zhǎng)度的內(nèi)存的內(nèi)容,原型分別如下:
void *memcpy(void *dst, const void *src, size_t count); void *memmove(void *dst, const void *src, size_t count);
他們的作用是一樣的,唯一的區(qū)別是,當(dāng)內(nèi)存發(fā)生局部重疊的時(shí)候,memmove保證拷貝的結(jié)果是正確的,memcpy不保證拷貝的結(jié)果的正確。
第一種情況下,拷貝重疊的區(qū)域不會(huì)出現(xiàn)問(wèn)題,內(nèi)容均可以正確的被拷貝。
第二種情況下,問(wèn)題出現(xiàn)在右邊的兩個(gè)字節(jié),這兩個(gè)字節(jié)的原來(lái)的內(nèi)容首先就被覆蓋了,而且沒(méi)有保存。所以接下來(lái)拷貝的時(shí)候,拷貝的是已經(jīng)被覆蓋的內(nèi)容,顯然這是有問(wèn)題的。
實(shí)際上,memcpy只是memmove的一個(gè)子集。
二者的c語(yǔ)言實(shí)現(xiàn)很簡(jiǎn)單,有興趣的朋友可以去看看。在實(shí)際情況下,這兩個(gè)函數(shù)都是用匯編實(shí)現(xiàn)的。
memmove在copy兩個(gè)有重疊區(qū)域的內(nèi)存時(shí)可以保證copy的正確,而memcopy就不行了,但memcopy比memmove的速度要快一些,如:
char s[] = "1234567890";
char* p1 = s;
char* p2 = s+2;
memcpy(p2, p1, 5)與memmove(p2, p1, 5)的結(jié)果就可能是不同的,memmove()可以將p1的頭5個(gè)字符"12345"正確拷貝至p2,而memcpy()的結(jié)果就不一定正確了
memcpy()、 memmove()和memccpy()
這三個(gè)函數(shù)的功能均是將某個(gè)內(nèi)存塊復(fù)制到另一個(gè)內(nèi)存塊。前兩個(gè)函數(shù)的區(qū)別在于它們處理內(nèi)存區(qū)域重疊(overlapping)的方式不同。第三個(gè)函數(shù)的功能也是復(fù)制內(nèi)存,但是如果遇到某個(gè)特定值時(shí)立即停止復(fù)制。
對(duì)于庫(kù)函數(shù)來(lái)說(shuō),由于沒(méi)有辦法知道傳遞給他的內(nèi)存區(qū)域的情況,所以應(yīng)該使用memmove()函數(shù)。通過(guò)這個(gè)函數(shù),可以保證不會(huì)出現(xiàn)任何內(nèi)存塊重疊問(wèn)題。而對(duì)于應(yīng)用程序來(lái)說(shuō),因?yàn)榇a“知道”兩個(gè)內(nèi)存塊不會(huì)重疊,所以可以安全地使用memcpy()函數(shù)。
關(guān)于memmove的實(shí)現(xiàn):
void *mymemmove(void *dest, const void *src, size_t n) { char temp[n]; int i; char *d = dest; const char *s = src; for (i = 0; i < n; i++) temp[i] = s[i]; for (i = 0; i < n; i++) d[i] = temp[i]; return dest; }
關(guān)于memcpy的實(shí)現(xiàn):
void *mymemcpy(void *dest, const void *src, size_t n) { char *d = dest; const char *s = src; int *di; const int *si; int r = n % 4; while (r--) *d++ = *s++; di = (int *)d; si = (const int*)s; n /= 4; while (n--) *di++ = *si++; return dest; }
相關(guān)文章
C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解
這篇文章主要介紹了 C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解的相關(guān)資料,這里提供了幾種實(shí)現(xiàn)方法,幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08C語(yǔ)言strlen和sizeof在數(shù)組中的使用詳解
對(duì)于 strlen 和 sizeof,相信不少程序員會(huì)混淆其功能。雖然從表面上看它們都可以求字符串的長(zhǎng)度,但二者卻存在著許多不同之處及本質(zhì)區(qū)別2021-10-10C語(yǔ)言位運(yùn)算符:與、或、異或、取反、左移與右移詳細(xì)介紹
以下是對(duì)C語(yǔ)言中的位運(yùn)算符:與、或、異或、取反、左移與右移進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08C++實(shí)現(xiàn)LeetCode(107.二叉樹(shù)層序遍歷之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(107.二叉樹(shù)層序遍歷之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言實(shí)現(xiàn)猜數(shù)字的小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)猜數(shù)字的小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01C++?如何將Lambda轉(zhuǎn)換成函數(shù)指針
這篇文章主要介紹了C++?如何將Lambda轉(zhuǎn)換成函數(shù)指針,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11C++中的多態(tài)與虛函數(shù)的內(nèi)部實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇C++中的多態(tài)與虛函數(shù)的內(nèi)部實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12C語(yǔ)言求兩個(gè)正整數(shù)的最大公約數(shù)示例代碼
在C語(yǔ)言中求兩個(gè)數(shù)的最大公約數(shù)是學(xué)習(xí)循環(huán)語(yǔ)句的非常經(jīng)典的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言求兩個(gè)正整數(shù)的最大公約數(shù)的相關(guān)資料,需要的朋友可以參考下2021-12-12