詳解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)問題,內(nèi)容均可以正確的被拷貝。
第二種情況下,問題出現(xiàn)在右邊的兩個(gè)字節(jié),這兩個(gè)字節(jié)的原來(lái)的內(nèi)容首先就被覆蓋了,而且沒有保存。所以接下來(lái)拷貝的時(shí)候,拷貝的是已經(jīng)被覆蓋的內(nèi)容,顯然這是有問題的。
實(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ō),由于沒有辦法知道傳遞給他的內(nèi)存區(qū)域的情況,所以應(yīng)該使用memmove()函數(shù)。通過這個(gè)函數(shù),可以保證不會(huì)出現(xiàn)任何內(nèi)存塊重疊問題。而對(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;
}
上一篇:在C語(yǔ)言中使用對(duì)數(shù)函數(shù)的方法
欄 目:C語(yǔ)言
下一篇:在C語(yǔ)言中轉(zhuǎn)換時(shí)間的基本方法介紹
本文標(biāo)題:詳解C語(yǔ)言中的memset()函數(shù)
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2827.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?


