2013-02-15 10 views
5

なぜこれは機能しませんか?これを機能させるためにクリエイティブなキャスティングが可能ですか?イニシャライザをポインタにキャストする

1: const char* yo1 = "abc"; 
2: const char* yo2 = { 'a', 'b', 'c', '\0' }; // <-- why can't i do this? 
3: printf("%s %s\n", yo1, yo2); 

結果:セグメンテーションフォールト

2行目は、私はそれが何を期待して何をしていません。有効な

const char* yo2 = (char [4]) { 'a', 'b', 'c', '\0' }; 

をし、あなたが望むものを達成します:

答えて

5

あなたが行うことができます。 yo2がファイル・スコープで宣言された場合に前者の場合

const char* yo2 = "abc": 

、:化合物リテラル配列は静的記憶域期間を有するがyo2は、ブロックスコープで宣言されたときに化合物リテラルを有することと等価ではないことに注意してください自動保存期間。

後者の場合、​​は文字列リテラルであり、静的な記憶期間(ファイルスコープまたはブロックスコープ)を持ちます。

const char yo2[] = { 'a', 'b', 'c', '\0' }; 

あなたの例について:

また、代わりにポインタの配列を使用することができます。 Cでは:

const char* yo2 = { 'a', 'b', 'c', '\0' }; 

が有効でないと、あなたのコンパイラはとして解釈:'a'の値がポインタ値(アドレス)ではありません

const char* yo2 = (char *) 'a'; 

のでyo2は未定義の動作を呼び出します逆参照。

+0

いいえ! RHSは一時的です。それは周りを固執することは保証されていません。 – nneonneo

+0

@nneonneoそれは複合リテラルです。ブロックスコープで宣言されている場合、自動保存期間があります。今なぜdownvoteしてください? – ouah

+0

Cでは、はい。しかし、これはC++で使用するか、C++モードでコンパイルするとすぐに安全になりません。私の本では安全な練習ではありません。 – nneonneo

関連する問題