2017-11-12 18 views
20

は、この宣言は非常に混乱している:混乱宣言と初期化子

char* q {new char[1024]{}}; // q[i] becomes 0 for all 

が、これは「char配列へのポインタ」、または「charポインタの配列」となっていますか?

new char[1024]{}は、それぞれ0の値を持つ1024要素のcharの配列を初期化していると思います。

だから、これは同じです:

char* q = [0,0,....] // until 1024 

正しいですか?

+0

'char * q'は' char'へのポインタです。 – melpomene

答えて

22

qに等しい

char* q = new char[1024]{}; 

に等しいcharへのポインタです。つまり、タイプはchar *です。

new char[1024]{}の式を使用して初期化され、charという配列を動的に割り当て、ゼロ初期化します。これが失敗すると、例外がスローされます。

qは、動的に割り当てられた配列の最初のcharを指します。これは配列ではありません。

それは

するchar * Q = [0,0、...] //と同じではない

すなわち無効な構文であるから1024まで。 qはポインタであり、値の集合に初期化することができないので、それはまた、

char* q = {0,0,....}; // 1024 zeros in initialiser 

と等価ではありません。これは、文字が、むしろ最初に初期化されていないし、その後ゼロで上書き(そして、もちろん、それが初期化方法をコンパイラ次第ですされているよりも、ゼロに初期化されていることを除いて

char *q = new char[1024];  // dynamically allocates chars uninitialised here 
std::fill(q, q + 1024, '\0'); 

に(ネット)効果で接近していますキャラクター)。

+0

ありがとう!素晴らしい説明!私は今、 'p'が最初の要素のアドレスを指していることを理解しています。 ** 1024 ** '8-bit bits of memory'(正しい用語がわからない)がヒープ上に予約されていて、' 0 'に初期化されていると言うのは正しいですか? –

+3

@ SamHammamy「少なくとも1024のアドレス指定可能なメモリユニットのサイズのメモリが新しい演算子で割り当てられている」と(過度に)正しいことが言えます。なぜなら、 'char'は最小のアドレス指定可能なメモリユニットを定義しており、ビット単位のカウントはセカンダリなので、配列にはより多くのメモリを割り当てることができるからです。ヒープが標準によって認識されないので、 'operator new'。通常のマシンでは、これはあなたが言ったものと同じになるでしょう。 – WorldSEnder

+1

@SamHammamy - それはかなり正しいとは言えません。'new'式は' 1024'(より厳密には 'char'のサイズの1024倍)のサイズのメモリを動的に割り当てますが、標準で' sizeof(char) 'を' 1'と定義しています。 WorldSEnder'が指摘しているように、インプリメンテーションはより多くを割り当てることができます(例えば、システムに依存する "ブロックサイズ"の倍数に丸めます)が、あなたのプログラムはそれに頼ることはできません。 「ヒープ」は、(古い)システムのメモリ管理の実装の詳細であり、標準が要求するものや他のシステムが行うことを反映していません。最後に、 'char'は8ビット以上です。 – Peter

28
char* q {new char[1024]{}}; 

順番に

char* q = new char[1024] { 0, 0, 0, 0 /* 1020 more zeros */ } 
関連する問題