Hopes

          Start Here..

           

          memset

          memset使用詳解



          功 能: 將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 <mem.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類型。例如下面這樣:

          int array[5] = {1,4,3,5,2};

          for(int i = 0; i < 5; i++)

          cout<<array<<" ";

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

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

          int array[5] = {1,4,3,5,2};

          for(int i = 0; i < 5; i++)

          cout<<array<<" ";

          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é)進(jìn)行賦 值,每個都用ASCII為1的字符去填充,轉(zhuǎn)為二進(jìn)制后,1就是00000001,占一個字節(jié)。一個INT元素是4字節(jié),合一起就是 1000000010000000100000001,就等于16843009,就完成了對一個INT元素的賦值了。

          所以用memset對非字符型數(shù)組賦初值是不可取的!

          樓上說的很對,只是程序執(zhí)行結(jié)果是0 0 0 0;程序不同的地方不在那里。程序如下:

          int array[5] = {1,4,3,5,2};

          for(int i = 0; i < 5; i++)

          cout<<array<<" ";

          cout<<endl;

          memset(array,1,5*sizeof(int)); //這里才是不同的地方

          for(int k = 0; k < 5; k++) //不同不在這里,k=1只是少循環(huán)了一次而已

          cout<<array[k]<<" ";

          cout<<endl;

          例如有一個結(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ù)詳細(xì)說明

          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;

          } 

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

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

          char str[100];

          memset(str,0,100);

          4。memset()的深刻內(nèi)涵:用來對一段內(nèi)存空間全部設(shè)置為某個字符,一般用在對定義的字符串進(jìn)行初始化為‘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.補(bǔ)充:某人的一點心得

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

          6。strcpy

          原型:extern char *strcpy(char *dest,char *src);

          用法:#i nclude

          功能:把src所指由NULL結(jié)束的字符串復(fù)制到dest所指的數(shù)組中。

          說明:src和dest所指內(nèi)存區(qū)域不可以重疊且dest必須有足夠的空間來容納src的字符串。

          返回指向dest的指針。

          memcpy

          原型:extern void *memcpy(void *dest, void *src, unsigned int count);

          用法:#i nclude

          功能:由src所指內(nèi)存區(qū)域復(fù)制count個字節(jié)到dest所指內(nèi)存區(qū)域。

          說明:src和dest所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向dest的指針。

          memset

          原型:extern void *memset(void *buffer, int c, int count);

          用法:#i nclude

          功能:把buffer所指內(nèi)存區(qū)域的前count個字節(jié)設(shè)置成字符c。

          說明:返回指向buffer的指針。

          原文鏈接:http://baike.baidu.com/view/982208.htm
          <====================================================================================================>

          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;
          } 
          3。memset() 函數(shù)常用于內(nèi)存空間初始化。如:
          char str[100];
          memset(str,0,100);

          4。memset()的深刻內(nèi)涵:用來對一段內(nèi)存空間全部設(shè)置為某個字符,一般用在對定義的字符串進(jìn)行初始化為‘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.補(bǔ)充:某人的一點心得
          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);

          6。strcpy
          原型:extern char *strcpy(char *dest,char *src);
          用法:#i nclude
          功能:把src所指由NULL結(jié)束的字符串復(fù)制到dest所指的數(shù)組中。
          說明:src和dest所指內(nèi)存區(qū)域不可以重疊且dest必須有足夠的空間來容納src的字符串。
          返回指向dest的指針。


          memcpy
          原型:extern void *memcpy(void *dest, void *src, unsigned int count);
          用法:#i nclude
          功能:由src所指內(nèi)存區(qū)域復(fù)制count個字節(jié)到dest所指內(nèi)存區(qū)域。
          說明:src和dest所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向dest的指針。



          memset
          原型:extern void *memset(void *buffer, int c, int count);
          用法:#i nclude
          功能:把buffer所指內(nèi)存區(qū)域的前count個字節(jié)設(shè)置成字符c。
          說明:返回指向buffer的指針。

          原文鏈接:http://www.azure.net.ru/read.php/137.htm

          posted on 2012-09-09 13:57 ** 閱讀(283) 評論(0)  編輯  收藏 所屬分類: C/C++


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計

          公告

          你好!

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          收藏夾

          C#學(xué)習(xí)

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 金昌市| 赣榆县| 田东县| 新巴尔虎右旗| 霍州市| 香格里拉县| 莱阳市| 千阳县| 板桥市| 大同市| 平南县| 桃园市| 南郑县| 平利县| 喜德县| 长岛县| 额尔古纳市| 咸宁市| 泰宁县| 延吉市| 余姚市| 达日县| 新丰县| 浦东新区| 曲沃县| 钦州市| 吐鲁番市| 巴塘县| 穆棱市| 屏山县| 股票| 文登市| 共和县| 盐山县| 丹东市| 海盐县| 高青县| 汶上县| 句容市| 芮城县| 孙吴县|