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

首頁 > 編程 > C++ > 正文

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

2020-05-23 14:02:35
字體:
供稿:網(wǎng)友

本文實例講述了C++中memset函數(shù)用法。分享給大家供大家參考,具體如下:

功 能: 將s所指向的某一塊內(nèi)存中的每個字節(jié)的內(nèi)容全部設(shè)置為ch指定的ASCII值,塊的大小由第三個參數(shù)指定,這個函數(shù)通常為新申請的內(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: ***********

編譯平臺:
Microsoft Visual C++ 6.0

也不一定就是把內(nèi)容全部設(shè)置為ch指定的ASCII值,而且該處的ch可為int或者其他類型,并不一定要是char類型。例如下面這樣:

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é)為單位,所以,對于int或其他的就并不是都乘默認的1(字符型)了。而且不同的機器上int的大小也可能不同,所以最好用sizeof()。

要注意的是,memset是對字節(jié)進行操作,所以上述程序如果改為

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

為什么呢?

因為memset是以字節(jié)為單位就是對array指向的內(nèi)存的5個字節(jié)進行賦值,每個都用ASCII為1的字符去填充,轉(zhuǎn)為二進制后,1就是00000001,占一個字節(jié)。一個INT元素是4字節(jié),合一起就是00000001000000010000000100000001,就等于16843009,就完成了對一個INT元素的賦值了。

所以用memset對非字符型數(shù)組賦初值是不可取的!(????我好像看到有可以啊,又帶確認)

例如有一個結(jié)構(gòu)體Some x,可以這樣清零:

memset( &x, 0, sizeof(Some) );

如果是一個結(jié)構(gòu)體的數(shù)組Some x[10],可以這樣:

menset( x, 0, sizeof(Some)*10 );

memset函數(shù)詳細說明

1. void *memset(void *s,int c,size_t n)

總的作用:將已開辟內(nèi)存空間 s 的首 n 個字節(jié)的值設(shè)為值 c。

2. 例子

main(){char *s="Golden Global View";clrscr();memset(s,'G',6);//貌似這里有點問題//printf("%s",s);getchar();return 0;}

【這個問題相當大,程序根本就運行不下去了,你這里的S志向的是一段只讀的內(nèi)存,而你memset又試圖修改它,所以運行時要出錯,修改辦法char *s修改為char s[]】

3. memset() 函數(shù)常用于內(nèi)存空間初始化。如:

char str[100];memset(str,0,100);

4. memset()的深刻內(nèi)涵:用來對一段內(nèi)存空間全部設(shè)置為某個字符,一般用在對定義的字符串進行初始化為‘memset(a, '/0', sizeof(a));
memcpy用來做內(nèi)存拷貝,你可以拿它拷貝任何數(shù)據(jù)類型的對象,可以指定拷貝的數(shù)據(jù)長度;例:

char a[100], b[50];memcpy(b, a, sizeof(b));//注意如用sizeof(a),會造成b的內(nèi)存地址溢出。

strcpy就只能拷貝字符串了,它遇到'/0'就結(jié)束拷貝;例:

char a[100], b[50];strcpy(a,b);

如用strcpy(b,a),要注意a中的字符串長度(第一個‘/0'之前)是否超過50位,如超過,則會造成b的內(nèi)存地址溢出。

5. 補充:某人的一點心得

memset可以方便的清空一個結(jié)構(gòu)類型的變量或數(shù)組。

如:

struct sample_struct{char csName[16];int iSeq;int iType;};

對于變量

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));

希望本文所述對大家C++程序設(shè)計有所幫助。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 隆回县| 湛江市| 靖江市| 石林| 宁远县| 井陉县| 安新县| 读书| 综艺| 峨边| 开封县| 宿松县| 巴林右旗| 连山| 凭祥市| 台北市| 黎平县| 伊吾县| 太仓市| 平湖市| 惠来县| 华池县| 曲周县| 阜平县| 礼泉县| 蒲江县| 丰顺县| 红安县| 蒙阴县| 包头市| 乃东县| 乐陵市| 萨迦县| 沙河市| 蛟河市| 阳东县| 平阴县| 扎兰屯市| 赤峰市| 江口县| 许昌市|