2010-10-23 317 views
1

可能重複:
What's the difference between new char[10] and new char(10)char * t = new char和char * t = new char [10]有什麼不同?

是什麼

char* t1=new char 

char* t2=new char[10]; 

在兩者之間的不同分配內存和T1 [100] = 'm' 和T2 [100] = 'm' 是爲他們編輯後

-----------正確:

但爲什麼我們可以如果t1是動態分配的字符,則使用t1 [100] char不是char字符的數組

+0

你是什麼意思「t(x)[100] ='m'是正確的」?這只是一個巧合,你可以在沒有程序崩潰的情況下將該內存設置爲'm'。您尚未分配該內存,因此您將數組的末尾寫入可能是任何內容的內存中。 – 2010-10-23 22:06:54

+1

基本上是一個副本:http://stackoverflow.com/questions/3902011/whats-the-difference-between-new-char10-and-new-char10,除了在你的問題最終評論。 't [100] ='m'是格式良好的,但會導致兩種情況下的未定義行爲。別。 – GManNickG 2010-10-23 22:07:49

+1

您可以使用't1 [100]',因爲當'X'是一個指針時'X [I]'相當於'*(X + I)'。您只需盲目移動指針值100個元素並解除引用。 C++不關心或試圖保護程序員不做愚蠢的事情。隨你便。 – GManNickG 2010-10-23 22:21:00

回答

0

t1指向動態分配的char; t2指向一個動態分配的10個字符的數組。但我相信這是C++,而不是C,而且這絕對是重複的。後

修訂OP的編輯 P [n],其中p是一個指針和n是整數,相當於*(P + N)因此它就像訪問從你的p指向100個字符的路程。在你的情況下(t1和t2),第100個(第101個)元素超出你的所有權,所以它是UB。其實上述事實使得與array[2]互換地編寫2[array]是合法的。花哨,但不這樣做:)

3

您需要delete這些不同,因爲陣列使用的operator new不同的變種分配:

delete t1; 
delete [] t2; 
4

你的第一種情況下會創建一個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 
}