2013-07-09 63 views
0
#include<iostream> 
using namespace std; 
int main() 
{ 
    cout<<"Enter\n"; 
    char ch[0]; 
    cin>>ch; 
    cout<<sizeof ch; 
    cout<<sizeof &ch; 
    cout<<"\n You entered \n"<<ch<<"\n";  
    return 0; 
} 

我使用g ++編譯器編譯C++程序。內存分配char chchar ch[0]有什麼區別。 ch可以接受一個字符,但ch[0]可以接受很多字符(我放在qqqqqqqq)。爲什麼?另外爲什麼sizeof ch返回0,而sizeof &ch給出4,但ch接受超過四個字符?C++中字符數組的內存分配

+7

標準C++不允許零大小的自動存儲陣列。所以你必須使用編譯器擴展。 – juanchopanza

+7

即使如此......您如何/爲什麼期望一個零大小的數組可以容納任何東西? – 2013-07-09 17:23:47

+0

我這樣做只是爲了理解內存分配。如果我給ch [1],而不是ch [0],那麼也可以給出很多字符。我在Ubuntu 12.04 –

回答

1

讓我們這個逐行:

char ch[0]; 

聲明字符的零長度的數組。正如評論中提到的那樣,C++標準實際上並不允許這樣做,但g ++可能會這樣做。

cin >> ch; 

將所有讀入的內容放入零長度數組中。由於cin不知道數組的長度(當它傳遞到數據流時會衰減到char *),它會盡可能多地寫入,這意味着它可以存儲多於零個字符。

cout << sizeof ch; 

輸出數組的大小(即以字節爲單位的總空間),它是零,如前所述。

cout << sizeof &ch; 

輸出陣列,這是您的體系結構的4個字節的地址的尺寸,因爲它只是一個指針。

cout << "You entered\n" << ch << "\n"; 

輸出存儲在數組中的任何數據,因爲正如我所提到的,零長度數組不是標準的C++。此外,由於cout直到遇到一個空字節(\0),它寫入就像你存儲,因爲再次,cout不在乎你是否有大小0或大小413 delcared ch只是寫內存。

+0

非常感謝。 –

0

char ch和char ch [0]的內存分配有什麼區別。

不同之處在於編譯器要保護自己的程度。一個數組只是一個連續的內存塊,C++沒有數組越界異常,並且在寫入之前不檢查數組邊界。通過使用

char ch[0]; 

你已經告訴C++編譯器你將負責界限檢查。這是一個緩衝區溢出(記住那些)。當您將'qqqq'分配給ch[0]時,您已覆蓋屬於某個其他變量,函數或程序的其他一部分內存。如果您需要更好的理解,請嘗試運行下面的程序。

// Note that I'm setting arr[10], which in Java (or any other modern language) would 
// be an array out of bound exception 
// I haven't run this program, but you're most likely to get 'a' printed 
// to standard out 
char arr[10], achar; 
arr[10] = 'a'; 
cout << achar; 
+0

中使用了標準g ++編譯器我得到了「Aborted.Core dumped」運行時錯誤 –

+0

但是在上面的代碼中,當我給出 arr [14] ='a' 時,它打印一些垃圾值而不是中止核心傾倒錯誤 –