你的第一種情況下會創建一個char
元件(1個字節)而第二種情況則創建10個連續的元素(10個字節)。但是,在這兩種情況下,您對t(x)[100]='m'
的訪問都未定義。也就是說,您正在請求指針位置後的100個字節,這很可能是垃圾數據。
換句話說,你的'm'賦值將覆蓋已經存在的任何東西,這可能是另一個數組中的數據。因此,您可能會在運行時遇到一些奇怪的錯誤。
C/C++允許程序員訪問數組越界,因爲數組實際上只是指向連續內存的指針。約定t1[100]
僅僅是指針之後的100個字節,不管它是什麼。
如果您想要「安全」陣列,請使用vector
類並調用at()
函數。如果訪問無效,這將拋出out_of_range
異常。
Stroustrup給出了下面的例子:
template<class T> class Vec : public vector<T> {
public:
Vec() : vector<T>() {}
Vec(int s) : vector<T>(s) {}
T& operator[] (int i) {return at(i);}
const T& operator[] (int i) const {return at(i);}
};
這個類是邊界安全。我可以這樣使用它:
Vec<char> t3(10); // vector of 10 char elements
try {
char t = t3[100]; // access something we shouldn't
}
catch (out_of_range) {
cerr << "Error!" << endl; // now we can't shoot ourselves in the foot
}
你是什麼意思「t(x)[100] ='m'是正確的」?這只是一個巧合,你可以在沒有程序崩潰的情況下將該內存設置爲'm'。您尚未分配該內存,因此您將數組的末尾寫入可能是任何內容的內存中。 – 2010-10-23 22:06:54
基本上是一個副本:http://stackoverflow.com/questions/3902011/whats-the-difference-between-new-char10-and-new-char10,除了在你的問題最終評論。 't [100] ='m'是格式良好的,但會導致兩種情況下的未定義行爲。別。 – GManNickG 2010-10-23 22:07:49
您可以使用't1 [100]',因爲當'X'是一個指針時'X [I]'相當於'*(X + I)'。您只需盲目移動指針值100個元素並解除引用。 C++不關心或試圖保護程序員不做愚蠢的事情。隨你便。 – GManNickG 2010-10-23 22:21:00