memset
函數常被我們用來初始化數組,然而有個坑可能會被我們踩到。
靜態數組初始化
一般情形是這樣的:
#include <cstring>
int main()
{
// 靜態數組arr
int arr[10];
// 將數組所有元素初始化為0
memset(arr,0,sizeof(arr));
// 遍歷輸出數組元素
for(int i=0;i<10;++i){
cout << arr[i] << endl;
}
return 0;
}
這樣做是正確的,通過輸出可以看到正確結果。
注意:這份代碼中arr
是個靜態數組。
動態數組初始化
#include <cstring>
int main()
{
// 動態數組arr
int* arr=new int[10];
// 將數組所有元素初始化為0
memset(arr,0,sizeof(arr));
// 遍歷輸出數組元素
for(int i=0;i<10;++i){
cout << arr[i] << endl;
}
return 0;
}
這份代碼運行后,我們發現memset
並沒有把數組元素全部初始化為0。
注意:arr
是個動態數組
原因如下:
我們可以在上面兩份代碼中輸出sizeof(arr)
,可以發現結果是不一樣的。
因為在第一份代碼中arr
代表一個數組,第二份代碼中arr
代表一個指針。(關於數組名是什么這個問題可以參考我的另一篇文章:https://www.cnblogs.com/chouxianyu/p/11322951.html,其實這個問題我覺得是編譯原理應該會學到的)
解決方案
初始化數組(靜態動態均可)時,把代碼改成memset(arr,0,sizeof(int)*10);
,int
是數組元素的類型,10
是數組元素個數。
作者:@臭咸魚
轉載請注明出處:https://www.cnblogs.com/chouxianyu/
歡迎討論和交流!