關於sizeof的誤用問題

編程練習寫選擇排序算法的時候,居然把sizeof函數使用錯了,感覺還是有必要在這裏寫博客記錄一下自己犯的這個低級錯誤,以警示自己編碼:

下面是具體代碼:
#include <iostream>
#define CountOfArray(a) (sizeof(a)/sizeof(a[0]))

using std::cout;
using std::endl;

/** Selection Sort**/
int findMaxItemIndex(int dataList[], int leftPos, int rightPos)
{
    int maxPos = leftPos;
    int currentPos= leftPos;
    while(++currentPos < rightPos)
    {
        if(dataList[currentPos] > dataList[maxPos])
        {
            maxPos = currentPos;
        }
    }
    return maxPos;
}

void selection_sort(int dataList[], int count)
{
    //錯誤的用法:參數傳進來的數組指針,sizeo函數調用後應該是指針的長度而不是數組的長度。
    int len = CountOfArray(dataList); 
    if(len != count)
    {
        cout<<"Array len is :"<<len<<endl;
        cout<<"Array Lenght is not right."<<endl;
        return;
    }
    for(int i=count-1; i>0; --i)
    {
        int curMaxPos = findMaxItemIndex(dataList, 0, i);
        if(curMaxPos != i)
        {
            int temp = dataList[i];
            dataList[i] = dataList[curMaxPos];
            dataList[curMaxPos] = temp;
        }
    }
}

int main()
{
    const int count = 10;
    int data[count] = {7,2,6,4,0,9,5,1,3,8};
   
    int len = CountOfArray(data); //正確的用法
    if(len != count)
    {
        cout<<"Array Lenght is not right."<<endl;
        return -1;
    }
 
    selection_sort(data, count);
    for(int i = 0; i< count; i++)
    {
        cout<<data[i]<<endl;
    }
    getchar();
}
如果sizeof(數組名)的調用有兩種情況:
1. 數組作爲參數壓棧,並作爲參數傳入sizeof(數組名):計算出來的值實際上是指針的長度。
2. 數組是在當前的函數中定義,隨後作爲參數傳入sizeof(數組名)計算出來的值是整個數組的長度。但是如果當數組作爲函數的參數進行傳遞時,該數組自動退化爲同類型的指針。

看到這裏,你應該已經明白我犯的低級錯誤和我這裏要說的意思,如果你希望提高你的代碼安全性,對數組的長度進行判斷,那麼請注意,如果你把數組作爲參數產給函數,並在函數內被sizeof函數計算,可想而知,結果一定不是你的初衷。

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