memset初始化數組的坑


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/

歡迎討論和交流!



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM