C++中memset函數(shù)用法詳解
本文實(shí)例講述了C++中memset函數(shù)用法。分享給大家供大家參考,具體如下:
功 能: 將s所指向的某一塊內(nèi)存中的每個(gè)字節(jié)的內(nèi)容全部設(shè)置為ch指定的ASCII值,塊的大小由第三個(gè)參數(shù)指定,這個(gè)函數(shù)通常為新申請(qǐng)的內(nèi)存做初始化工作
用 法: void memset(void *s, char ch, unsigned n);
程序示例:
#include <string.h> #include <stdio.h> #include <memory.h> int main(void) { char buffer[] = "Hello world\n"; printf("Buffer before memset: %s\n", buffer); memset(buffer, '*', strlen(buffer) ); printf("Buffer after memset: %s\n", buffer); return 0; }
輸出結(jié)果:
Buffer before memset: Hello world
Buffer after memset: ***********
編譯平臺(tái):
Microsoft Visual C++ 6.0
也不一定就是把內(nèi)容全部設(shè)置為ch指定的ASCII值,而且該處的ch可為int或者其他類(lèi)型,并不一定要是char類(lèi)型。例如下面這樣:
char array[5] = {1,4,3,5,2}; for(int i = 0; i < 5; i++) cout<<array[i]<<" "; cout<<endl; memset(array,"0",5*sizeof(int)); for(int k = 0; k < 5; k++) cout<<array[k]<<" "; cout<<endl;
輸出的結(jié)果就是:
1 4 3 5 2
0 0 0 0 0
后面的表大小的參數(shù)是以字節(jié)為單位,所以,對(duì)于int或其他的就并不是都乘默認(rèn)的1(字符型)了。而且不同的機(jī)器上int的大小也可能不同,所以最好用sizeof()。
要注意的是,memset是對(duì)字節(jié)進(jìn)行操作,所以上述程序如果改為
int array[5] = {1,4,3,5,2}; for(int i = 0; i < 5; i++) cout<<array[i]<<" "; cout<<endl; memset(array,1,5*sizeof(int));// 注意 這里與上面的程序不同 for(int k = 0; k < 5; k++) cout<<array[k]<<" "; cout<<endl;
輸出的結(jié)果就是:
1 4 3 5 2
16843009 16843009 16843009 16843009 16843009
為什么呢?
因?yàn)閙emset是以字節(jié)為單位就是對(duì)array指向的內(nèi)存的5個(gè)字節(jié)進(jìn)行賦值,每個(gè)都用ASCII為1的字符去填充,轉(zhuǎn)為二進(jìn)制后,1就是00000001,占一個(gè)字節(jié)。一個(gè)INT元素是4字節(jié),合一起就是00000001000000010000000100000001,就等于16843009,就完成了對(duì)一個(gè)INT元素的賦值了。
所以用memset對(duì)非字符型數(shù)組賦初值是不可取的!(????我好像看到有可以啊,又帶確認(rèn))
例如有一個(gè)結(jié)構(gòu)體Some x,可以這樣清零:
memset( &x, 0, sizeof(Some) );
如果是一個(gè)結(jié)構(gòu)體的數(shù)組Some x[10],可以這樣:
menset( x, 0, sizeof(Some)*10 );
memset函數(shù)詳細(xì)說(shuō)明
1. void *memset(void *s,int c,size_t n)
總的作用:將已開(kāi)辟內(nèi)存空間 s 的首 n 個(gè)字節(jié)的值設(shè)為值 c。
2. 例子
main(){ char *s="Golden Global View"; clrscr(); memset(s,'G',6);//貌似這里有點(diǎn)問(wèn)題// printf("%s",s); getchar(); return 0; }
【這個(gè)問(wèn)題相當(dāng)大,程序根本就運(yùn)行不下去了,你這里的S志向的是一段只讀的內(nèi)存,而你memset又試圖修改它,所以運(yùn)行時(shí)要出錯(cuò),修改辦法char *s修改為char s[]】
3. memset() 函數(shù)常用于內(nèi)存空間初始化。如:
char str[100]; memset(str,0,100);
4. memset()的深刻內(nèi)涵:用來(lái)對(duì)一段內(nèi)存空間全部設(shè)置為某個(gè)字符,一般用在對(duì)定義的字符串進(jìn)行初始化為‘memset(a, '\0', sizeof(a));
memcpy用來(lái)做內(nèi)存拷貝,你可以拿它拷貝任何數(shù)據(jù)類(lèi)型的對(duì)象,可以指定拷貝的數(shù)據(jù)長(zhǎng)度;例:
char a[100], b[50]; memcpy(b, a, sizeof(b)); //注意如用sizeof(a),會(huì)造成b的內(nèi)存地址溢出。
strcpy就只能拷貝字符串了,它遇到'\0'就結(jié)束拷貝;例:
char a[100], b[50]; strcpy(a,b);
如用strcpy(b,a),要注意a中的字符串長(zhǎng)度(第一個(gè)‘\0'之前)是否超過(guò)50位,如超過(guò),則會(huì)造成b的內(nèi)存地址溢出。
5. 補(bǔ)充:某人的一點(diǎn)心得
memset可以方便的清空一個(gè)結(jié)構(gòu)類(lèi)型的變量或數(shù)組。
如:
struct sample_struct { char csName[16]; int iSeq; int iType; };
對(duì)于變量
struct sample_strcut stTest;
一般情況下,清空stTest的方法:
stTest.csName[0]='\0'; stTest.iSeq=0; stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是數(shù)組:
struct sample_struct TEST[10];
則:
memset(TEST,0,sizeof(struct sample_struct)*10);
或:
memset(TEST,0,sizeof(TEST));
希望本文所述對(duì)大家C++程序設(shè)計(jì)有所幫助。
上一篇:DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--舉例及編程中的心得
欄 目:C語(yǔ)言
下一篇:DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--浮點(diǎn)數(shù)的存儲(chǔ)格式
本文標(biāo)題:C++中memset函數(shù)用法詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2214.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wè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ù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有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-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什