2011-11-11 8 views
6

Occasionaly、私は私のプログラムのコードのいずれかの場所にタイプミスを作った:角括弧で配列を実際に初期化することはできますか?

int a = 10; 
char* b = new char(a); 

エラーは明白です:私が書いた()の代わりに、[]。奇妙なことは...コードがコンパイルされていることです。デバッガで正常に実行されました。しかし、コンパイルされた.exeは、デバッガの外で、これらの行の関数が実行された後、瞬時にクラッシュしました。

2行目のコードは本当に正当なものですか?それがあれば、コンパイラにとってどういう意味ですか?

答えて

10

数値がaの単一の文字です(この場合は10)。ポインタは配列を指すだけではありません。

5

を割り当ててcharとし、aの値を割り当てています。配列をまったく割り当てていません。

それは他のタイプのためにnew式でコンストラクタを呼び出すのと同じです:

std::string* s = new std::string("foo"); 
int* i = new int(10); 
std::vector<std::string>* v = new std::vector<std::string>(5, "foo"); 
2

char t(a)aの値に初期化されたローカル文字を作成します。
new char (a)は、aの値に初期化された動的に割り当てられたcharを作成します。

関連する問題