1. 程式人生 > >C++的memset的使用原理及幾種基礎用法

C++的memset的使用原理及幾種基礎用法

1.使用原理

先來看看C標準庫裡面memset的原始碼

void *(memset)(void *s, int c, size_t n)  
{  
    const unsigned char uc = c;  
    unsigned char *su;  
    for (su = s; 0 < n; ++su, --n)  
        *su = uc;  
    return (s);  
}

可以看出,這個函式本身是為字元陣列設計的,這也是為什麼你呼叫memset需要包含cstring標頭檔案的原因。
觀察原始碼可以得出,c的值每次都會賦給一個位元組,而不是一次性賦給四個位元組,而int是四個位元組,所以每次c的值都只會賦值給最低位的位元組的內容。
舉個例子:
如果你寫memset(a,1,sizeof(int));而1的八位二進位制是00000001
那麼int型別陣列a一個元素就會變成00000001000000010000000100000001,轉成十進位制也就是16843009,是個很大的數,顯然不符合我們想要賦值為1的初衷。

#include <cstdio>  
#include <cstdlib>  
#include <cstring>  
#include <iostream>  
#include <cmath>  
#include <algorithm>  
using namespace std;  
int main()  
{  
    int a[5];  
    memset(a,1,sizeof(a));
    char s[40];
    itoa(a[0],s,2);//轉為二進位制
    for (int
i=0;i<=4;i++) { printf("%d\n",a[i]); printf("%s\n",s); } return 0; } //輸出: 16843009 1000000010000000100000001 16843009 1000000010000000100000001 16843009 1000000010000000100000001 16843009 1000000010000000100000001 16843009 1000000010000000100000001

那麼為什麼賦值0,-1可以呢
先看0:八位全零填充四次,得到32位的零,還是零,賦0成功
-1:-1的低八位二進位制碼為11111111,填充四次,int型別還是-1,賦-1成功。
1.初始化位元組
當初始化一個位元組單位的陣列時,可以用memset把每個陣列單元初始化成任何你想要的值,因為memset本來就是為字元陣列設計的。

char data[10];  
memset(data, 1, sizeof(data));    // right  
memset(data, 0, sizeof(data));    // right  

2.初始化其他基礎型別
注意一點:只能初始化為0或-1

int data[10];  
memset(data, 0, sizeof(data));    // right  
memset(data, -1, sizeof(data));    // right  
memset(data, 1, sizeof(data));    // wrong, data[x] would be 0x0101 instead of 1

3.初始化結構體(方便)

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

ps:不會轉二進位制的itoa()函式的請戳:itoa()的用法