1. 程式人生 > 其它 >memset初始化陣列易錯點

memset初始化陣列易錯點

技術標籤:NOI

memset(a, 1, sizeof a);

如下程式碼,不少同學會以為a[]被初始化為1,其實不是的,是被初始化為16843009,為什麼是這個數呢?

#include <bits/stdc++.h>
using namespace std;
int n, a[14];
int main()
{
	memset(a, 1, sizeof a);
	for(int i=0; i<14; ++i){
		cout << a[i] << endl;
	}
	return 0;
}

執行結構如下:

memset(a, 1, sizeof a);

原因

拿memset(a, 1, sizeof a); 為例, memset是按位元組對整數陣列a[]初始化,地址中每個位元組都初始化為1,我們知道在大部分機器中,int佔4個位元組,所以使用memset對a初始化為1時,對應每一個a[i],是有4個位元組的。那麼每個a[i]會被初始化4個1,具體看下面:

每個a[i]佔4個位元組,每個位元組8位,每個位元組的8位初始化為1,用二進位制表示為: 00000001

那麼4個位元組,每個位元組都初始化為1,用二進位制表示為00000001000000010000000100000001,對應的10進位制數為16843009。

所以初始化後的a[i]不是1,而是16843009。

通過程式計算,驗證:

#include <bits/stdc++.h>
using namespace std;
int n, a[14];
int main()
{
	memset(a, 1, sizeof a);
	cout << fixed << setprecision(0) << pow(2,0)+pow(2,8)+pow(2,16)+pow(2,24) << endl;
	for(int i=0; i<14; ++i){
		cout << a[i] << endl;
	}
	return 0;
}

那麼memset有什麼用呢?

memset(a, 0, sizeof a); 可以初始化為0,因為4個位元組,每個位元組初始化為0之後的值為: 00000000 00000000 00000000 00000000,仍然是0

memset(a, -1, sizeof a); 可以初始化為-1,因為4個位元組,每個位元組初始化為-1之後的值為: 11111111 11111111 11111111 11111111,仍然是-1

可以初始化為一個比較大的值,因為每個位元組只有8位,所以memset第二個引數的範圍是00000000-11111111,或者0x00-0xFF(常用這種寫法)

可一般用memset(a, 0x7f, sizeof a);來給陣列賦一個比較大的值。

不熟悉的同學,用memset的時候一定要檢查初始化是否如你所願。