memset函數用法總結(C/C++初始化函數)

使用時需要包含頭文件:<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;
}
	

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章