2014-11-16 37 views
2

根據C++標準,下列構造是否有效?在此聲明之後我可以如何處理arr?在不指定大小的情況下分配數組

char* arr = new char[]; 

在此先感謝。

+0

它在所有的標準無效。什麼是語義? – didierc

+1

我認爲*能*使這個有效的例外是用戶定義的位置new,其中用戶定義的參數是空的;但在這種情況下,你需要傳遞地址,所以,不要。 –

+2

我想你可能會尋找爲['的std :: VECTOR'(http://en.cppreference.com/w/cpp/container/vector) – sjdowling

回答

5

不,這是不允許的。在[expr.new]/1 新表達 S中的語法指定

noptr新聲明符
        [表達]屬性說明符-SEQ opt
          noptr-new-declaration rator [常數表達式] 屬性說明符-SEQ選擇

很明顯,有在代碼中括號之間沒有表達。它也沒有意義:你怎麼能分配一個未知長度的數組?

如果您需要動態更改大小的陣列,請使用std::vector

+0

如何定義「expression」? –

+0

@BartekBanachewicz這不是一個'語句'的東西。由於這是不是非常有幫助:http://stackoverflow.com/questions/3846727/why-is-the-difference-between-an-expression-and-a-statement – druckermanly

1

C++編譯器見於Ger.Offen定義擴展允許聲明大小= 0 Usualy的陣列也可以是一種用於在結構最後字段聲明有用這樣你就可以結構分配期間選擇這樣陣列的長度。

struct A 
{ 
    float something; 
    char arr[]; 
}; 

所以,如果你喜歡咱們說ARR分配這樣一個有7個元素,你這樣做:

A* p = (A*)malloc(sizeof(A) + sizeof(char)*7) ; 

你應該注意到的sizeof(A)是等於sizeof(浮動),所以對於編譯器你的ARR字段是0大小。

現在你可以使用你的編曲場多達7項指標:

p->arr[3]='d'; 
+0

儘管此功能在一些實現確實存在,這不是使用'new'的數組動態分配。 – didierc

相關問題