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).