memset函數用法


功 能

  將s所指向的某一塊內存中的每個字節的內容全部設置為ch指定的ASCII值,

 

  塊的大小由第三個參數指定,這個函數通常為新申請的內存做初始化工作,

 

  其返回值為指向S的指針。

 
 

用 法

  void *memset(void *s, int ch, unsigned n);

 

程序例

  #include <string.h>

 

  #include <stdio.h>

 

  #include <memory.h>

memset函數

 

  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;

 

  }

 

  輸出結果:

 

  Buffer before memset: Hello world

 

  Buffer after memset: ***********

 

  編譯平台:

 

  Microsoft Visual C++ 6.0

 

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

 

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

 

  輸出的結果就是:

 

  1 4 3 5 2

 

  0 0 0 0 0

 

  后面的表大小的參數是以字節為單位,所以,對於int或其他的就並不是都乘默認的1(字符型)了。而且不同的機器上int的大小也可能不同,所以最好用sizeof()。

 

  

 

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

 

  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;

 

  輸出的結果就是:

 

  1 4 3 5 2

 

  16843009 16843009 16843009 16843009 16843009

 

  為什么呢?

 

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

 

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

 

  例如有一個結構體Some x,可以這樣清零:

 

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

 

  如果是一個結構體的數組Some x[10],可以這樣:

 

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

 

memset函數詳細說明

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

 

  總的作用:將已開辟內存空間 s 的首 n 個字節的值設為值 c。

 

  2。例子

 

  main(){

 

  char *s="Golden Global View";

 

  clrscr();

 

  memset(s,'G',6);//貌似這里有點問題//

 

  printf("%s",s);

 

  getchar();

 

  return 0;

 

  } 

 

  【應該是沒有問題的,字符串指針一樣可以,並不是只讀內存,可以正常運行】

 

  3。memset() 函數常用於內存空間初始化。如:

 

  char str[100];

 

  memset(str,0,100);

 

  4。memset()的深刻內涵:用來對一段內存空間全部設置為某個字符,一般用在對定義的字符串進行初始化為‘memset(a, '\0', sizeof(a));

 

  memcpy用來做內存拷貝,你可以拿它拷貝任何數據類型的對象,可以指定拷貝的數據長度;例:

 

  char a[100], b[50];

 

  memcpy(b, a, sizeof(b)); //注意如用sizeof(a),會造成b的內存地址溢出。

 

  strcpy就只能拷貝字符串了,它遇到'\0'就結束拷貝;例:

 

  char a[100], b[50];

 

  strcpy(a,b);

 

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

 

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

 

  memset可以方便的清空一個結構類型的變量或數組。

 

  如:

 

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

 

  如果是數組:

 

  struct sample_struct TEST[10];

 

  則

 

  memset(TEST,0,sizeof(struct sample_struct)*10);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM