使用時需要包含頭文件:<memory.h>
函數原型:void *memset(void *s,int ch,size_t n);
函數解釋:將s中當前位置後面的n個字節 (typedef unsigned int size_t )用 ch 替換並返回 s
值得注意的是:
因爲memset函數是按字節來對內存塊進行初始化,所以函數原型中的ch的實際範圍是在0~255。因爲該函數只能取ch的後八位賦值給你所輸入的範圍的每個字節,比如int a[5]賦值memset(a,-1,sizeof(int )*5)與memset(a,511,sizeof(int )*5) 所賦值的結果是一樣的都爲-1;因爲-1的二進制碼爲(11111111 11111111 11111111 11111111)而511的二進制碼爲(00000000 00000000 00000001 11111111)後八位都爲(11111111),所以數組中每個字節,如a[0]含四個字節都被賦值爲(11111111),其結果爲a[0](11111111 11111111 11111111 11111111),即a[0]=-1。
因此無論ch多大隻有後八位二進制有效,而後八位二進制的範圍在(0~255)中改。而對字符數組操作時則取後八位賦值給字符數組,其八位值作爲ASCII碼。
所以當它想對int類型數組的元素進行初始化時,只能將其中的元素初始化爲0或-1
或者 某些4個字節都相同的數(如16843009等... 因爲16843009的二進制形式爲:0000 0001 0000 0001 0000 0001 0000 0001,也就是因爲該數 4個字節都相同 )。
下面用代碼來說明:
#include <iostream>
#include <memory.h>
using namespace std;
int main()
{
int a[4];
//cout<<sizeof(a);
memset(a, 0, sizeof(a));
for(int num: a)
cout<<num<<" ";
cout<<endl;
//輸出:0 0 0 0
/*當這裏的ch 爲255 或者是-1 其實效果都是一樣的
因爲255的二進制碼(4字節)爲:
0000 0000 1111 1111
-1的二進制碼爲(4字節):
1111 1111 1111 1111 1111 1111 1111 1111
然後該函數只能取ch的後八位賦值給你所輸入的範圍的每個字節
*/
memset(a, 255, sizeof(a));
for(int num: a)
cout<<num<<" ";
cout<<endl;
//輸出:-1 -1 -1 -1
memset(a, -1, sizeof(a));
for(int num: a)
cout<<num<<" ";
cout<<endl;
//輸出:-1 -1 -1 -1
/*因爲16843009的二進制碼爲:
0000 0001 0000 0001 0000 0001 0000 0001
也就是該數 4個字節都相同 */
memset(a, 1, sizeof(a));
for(int num: a)
cout<<num<<" ";
cout<<endl;
//輸出:16843009 16843009 16843009 16843009
return 0;
}