なぜこれが機能しないのですか?これを機能させるためにクリエイティブなキャスティングを行うことは可能ですか?
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行目は、私が期待していることをしていません。
なぜこれが機能しないのですか?これを機能させるためにクリエイティブなキャスティングを行うことは可能ですか?
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' };
これは有効であり、あなたが望むものを達成します。以下と同等ではないことに注意してください。
const char* yo2 = "abc":
前者の場合、yo2
がファイル スコープで宣言された場合: 複合リテラル配列には静的な保存期間がありますが、yo2
がブロック スコープで宣言された場合、複合リテラルには自動保存期間があります。
後者の場合、"abc"
文字列リテラルであり、静的な保存期間 (ファイル スコープまたはブロック スコープ) があります。
ポインターの代わりに配列を使用することもできます。
const char yo2[] = { 'a', 'b', 'c', '\0' };
あなたの例について。C:
const char* yo2 = { 'a', 'b', 'c', '\0' };
は有効ではなく、コンパイラは次のように解釈します。
const char* yo2 = (char *) 'a';
の値は'a'
ポインター値 (アドレス) ではないため、逆参照yo2
は未定義の動作を引き起こします。