詳解C語言中的memset()函數(shù)
C語言memset()函數(shù):將內(nèi)存的前n個字節(jié)設(shè)置為特定的值
頭文件:
#include <string.h>
memset() 函數(shù)用來將指定內(nèi)存的前n個字節(jié)設(shè)置為特定的值,其原型為:
void * memset( void * ptr, int value, size_t num );
參數(shù)說明:
ptr 為要操作的內(nèi)存的指針。
value 為要設(shè)置的值。你既可以向 value 傳遞 int 類型的值,也可以傳遞 char 類型的值,int 和 char 可以根據(jù) ASCII 碼相互轉(zhuǎn)換。
num 為 ptr 的前 num 個字節(jié),size_t 就是unsigned int。
【函數(shù)說明】memset() 會將 ptr 所指的內(nèi)存區(qū)域的前 num 個字節(jié)的值都設(shè)置為 value,然后返回指向 ptr 的指針。
memset() 可以將一段內(nèi)存空間全部設(shè)置為特定的值,所以經(jīng)常用來初始化字符數(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語言中的庫函數(shù),在頭文件string.h中,作用是拷貝一定長度的內(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ā)生局部重疊的時候,memmove保證拷貝的結(jié)果是正確的,memcpy不保證拷貝的結(jié)果的正確。

第一種情況下,拷貝重疊的區(qū)域不會出現(xiàn)問題,內(nèi)容均可以正確的被拷貝。
第二種情況下,問題出現(xiàn)在右邊的兩個字節(jié),這兩個字節(jié)的原來的內(nèi)容首先就被覆蓋了,而且沒有保存。所以接下來拷貝的時候,拷貝的是已經(jīng)被覆蓋的內(nèi)容,顯然這是有問題的。
實際上,memcpy只是memmove的一個子集。
二者的c語言實現(xiàn)很簡單,有興趣的朋友可以去看看。在實際情況下,這兩個函數(shù)都是用匯編實現(xiàn)的。
memmove在copy兩個有重疊區(qū)域的內(nèi)存時可以保證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個字符"12345"正確拷貝至p2,而memcpy()的結(jié)果就不一定正確了
memcpy()、 memmove()和memccpy()
這三個函數(shù)的功能均是將某個內(nèi)存塊復(fù)制到另一個內(nèi)存塊。前兩個函數(shù)的區(qū)別在于它們處理內(nèi)存區(qū)域重疊(overlapping)的方式不同。第三個函數(shù)的功能也是復(fù)制內(nèi)存,但是如果遇到某個特定值時立即停止復(fù)制。
對于庫函數(shù)來說,由于沒有辦法知道傳遞給他的內(nèi)存區(qū)域的情況,所以應(yīng)該使用memmove()函數(shù)。通過這個函數(shù),可以保證不會出現(xiàn)任何內(nèi)存塊重疊問題。而對于應(yīng)用程序來說,因為代碼“知道”兩個內(nèi)存塊不會重疊,所以可以安全地使用memcpy()函數(shù)。
關(guān)于memmove的實現(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的實現(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)文章
OpenCV利用K-means實現(xiàn)根據(jù)顏色進(jìn)行圖像分割
K-means是一種經(jīng)典的無監(jiān)督聚類算法---不需要人工干預(yù)。本文將通過K-means算法實現(xiàn)根據(jù)顏色進(jìn)行圖像分割的效果,感興趣的小伙伴可以嘗試一下2022-10-10
C++ Boost MultiIndex使用詳細(xì)介紹
Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱2022-11-11
C++ 中靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的區(qū)別
這篇文章主要介紹了C++ 中靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-05-05
C語言中枚舉與聯(lián)合體的使用方法(enum union)
枚舉的意思就是列舉,將每一個可能的取值都進(jìn)行一一列舉,下面這篇文章主要給大家介紹了關(guān)于C語言中枚舉與聯(lián)合體的使用方法,需要的朋友可以參考下2021-09-09
C++如何比較兩個字符串或string是否相等strcmp()和compare()
這篇文章主要介紹了C++如何比較兩個字符串或string是否相等strcmp()和compare()問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
C++的QT項目打包成獨立可執(zhí)行和發(fā)布的exe文件(項目構(gòu)建過程)
這篇文章主要介紹了C++的QT項目打包成獨立可執(zhí)行和發(fā)布的exe文件(項目構(gòu)建過程),本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-11-11

