C++的memset的使用原理及幾種基礎用法
阿新 • • 發佈:2019-01-26
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()的用法