国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++中memset函數(shù)用法詳解

2020-01-26 14:32:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(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ì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 务川| 苏尼特左旗| 临城县| 万全县| 马尔康县| 田阳县| 麻江县| 中西区| 乌鲁木齐市| 堆龙德庆县| 玛曲县| 荣成市| 民和| 江西省| 康马县| 湘西| 宜春市| 城口县| 娄烦县| 丽水市| 元氏县| 城市| 饶阳县| 昌平区| 文水县| 隆化县| 云阳县| 长治市| 宁化县| 高平市| 福州市| 永和县| 尚义县| 仪征市| 南投县| 信阳市| 平南县| 大方县| 甘德县| 六枝特区| 乐昌市|