- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:リテラル文字列に&を付けたときの挙動について)
リテラル文字列に&を付けたときの挙動について
このQ&Aのポイント
- リテラル文字列に&を付けてアドレス参照すると、gccでは正しく格納されますが、C言語仕様上保証されている動作かどうかは不明です。
- C99の仕様書(X3010:2003)には該当する記述が見つかりませんでした。
- &を取り除くことができる方法があれば、理由を明記してコード修正を検討することを検討しています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
規格を斜め読みした限りでは「一応正しいといえば正しい動作」と思えますが.... 文字列リテラルが「名前のない配列」であることと, 「配列名に単項 & を適用するとその配列名をポインタに変換したのと (違う型だけど) 同じ値が得られる」ことを組み合わせれば正しいと解釈できなくもないです. が, 正直なところを言えば「なぜここで『文字列リテラルに対して単項 & を適用する』必要があるのか」が分からないし, もっといえば「なぜ strcpy ではなく memcpy なのか」もわからん. 「仕事で触っているプログラム」の中にリテラルが直接現れるというのはちょっとどうかと思うし, その後ろの「5」も直接プログラムに書くのはいかがなものかと. せめて #define HOGE_STRING "hoge" memcpy(dst, HOGE_STRING, sizeof HOGE_STRING); // ないし strcpy くらいは書いてほしい. 端的には「何かを勘違いしてそう書いちゃったんだけどたまたま想定したように動いている」だけのように見える.
お礼
回答ありがとうございます。 気持ち悪いですが、移植性が確保されているのならば放置しようと思います。 ちなみに、最低限書いた人の名誉のために言うと、defineになってないのは 私が改変したからです。 &"hoge"について聞きたかったので、関係ない部分を簡略化しました。 実際のコードは以下に近いニュアンスで書いてあります。 memcpy(dst, &HOGE_STRING, sizeof(HOGE_STRING)); まぁ、&が気持ち悪いわけです。 > 端的には「何かを勘違いしてそう書いちゃったんだけどたまたま想定したように動いている」だけのように見える. ポインタのことを理解せずに書いている匂いは僕も感じます。