2010/10/31

2010/10/31

關鍵字:數組

 

數組聲明

數組的維數必須用值大於等於1的常量表達式定義。包括整型字面值、枚舉常量或用常量表達式初始化的const對象。即數組的維數必須在編譯時確定。

#include <vector>

using std::vector;

 

const int bufsize = 10;

 

int GetSize()

{

    return 0;

}

 

const int i = GetSize();                //i位於常量內存區中,未初始化

int main()

{

    char array[i];                      //錯誤,運行時才知道i的值

    char array1[bufsize*10/2+1-3];      //正確,編譯時就可以知道i的值

    int j = 1;

    char array2[j];                     //錯誤,雖然j是用常量表達式初始化的,

                                        //但是直到運行時才知道j的值

    char array3[0];                     //錯誤,必須非零

    char array4[1111111111111111];      //編譯錯誤

                                        //error C2148: total size of array must not exceed 0x7fffffff bytes

                                        //0x7fffffff是有符號型位整型的最大值

    vector<int> vec1(i);                //正確

    vector<int> vec2(bufsize*10/2+1-3); //正確

    vector<int> vec3(j);                //正確

    vector<int> vec4(0);                //正確

    vector<int> vec5(1111111111111111); //編譯時就可以檢測參數大小會報警告或

                                        //錯誤,如果報警告則運行時拋異常

 

    return 0;

}

 

簡單的總結下,位於常量內存區中及靜態全局內存區並且是已初始化的變量,在編譯時是已知的,纔可以作爲數組的維數.vector的元素個數除了非負數和太大之外,沒其他限制.

通過編譯器的報錯也可以知道在VC8,數組最大爲0x7fffffff.

 

數組初始化

1.     內置類型數組,在函數體內的數據未初始化;

2.     內置類型數組,函數體外則初始化爲0;

3.     不管數組在哪裏定義,如果其元素爲類類型,則自動調用該類的默認構造函數初始化,如果沒有默認構造函數,則必須爲該數組的元素提供顯式初始化;

 

 

class A

{

private:

    int a;

};

A g_Array[3];       //3個對象的a都被初始化爲0

int main()

{

    A array[3];     //3個對象的a都未初始化

 

    return 0;

}

初始化時調用的是類A的默認構造函數A(){},該函數不做任何事情,只負責分配內存並初始化變量.初始化變量的規則與初始化一般變量相同.

 

陷阱

char ca1[] = {'C', '+', '+'};           //正確,大小爲3

char ca2[] = {'C', '+', '+', '/0'};     //正確,大小爲4

char ca3[] = "C++";                     //正確,大小爲4

char ca4[3] = "C++";                    //錯誤,字面值常量字符串都有一個’/0’作爲結尾

 

程序員必須自己檢查數組下標,編譯器無法檢測到緩衝區溢出(buffer overflow).

 

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