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的時候一定要檢查初始化是否如你所願。