- ベストアンサー
C言語の基礎的な質問---文字配列の初期化
C言語の配列の初期化に関する質問です。 もし規格によって回答が異なる場合は、ANSIのCということにしてください。 関数の中に、 char str[ ]="ABC"; (イ) という宣言があるとします。(staticは付きません。) これは、 char str[ ]={'A', 'B', 'C', '\0'}; (ロ) と全く同じ意味でしょうか。 似て非なるものに char *str="ABC"; (ハ) というものがあります。この場合は、 strとは違うところに"ABC"('C'の次には'\0'があります。)という領域が確保されていて、 その先頭アドレスでstrが初期化されるのですよね。 (イ)(ロ)(ハ)のいずれの場合も関数の中に書かれているとすれば、 いずれもstrは自動変数で、関数実行時にstrの領域が確保されますよね。 (イ)は配列strの領域が確保されるときに、 配列strとは別のところにある"ABC"という領域の内容を、コピーして設定する、 ということでしょうか。 (ロ)は、配列の領域確保時にstr[0]を'A'で、str[1]を'B'で、str[2]を'C'で、str[3]を'\0'で、初期化する、 ということで、 配列とは別のところには"ABC"という領域はない、 という考えでよろしいでしょうか。 もしそうだとしたら、配列とは別のところに"ABC"という領域があるかどうかという点で(イ)と(ロ)は異なることになりますが、そう考えてよろしいのでしょうか。 それとも、そういうことは処理系に依存することなんでしょうか。
- みんなの回答 (4)
- 専門家の回答
補足
ということはこういうことですね。 (文字配列の初期化に関して) 配列とは別のところに初期化子があり、配列の領域を確保するときにそれをコピーしている。 初期化子がどこかになければ配列を初期化することは出来ない。 しかし、それは char *str="ABC"; (ハ) の"ABC"とは異なり、初期化子がどう並んでいるかはわからない。 どう並んでいてもそれを直接触ることは出来ないので関係ない。 つまり >この違いも使う上ではどうでもいいことですけど。 ということですね。 char str[ ]="ABC"; (イ) と char str[ ]={'A', 'B', 'C', '\0'}; (ロ) はまったく同じ意味だ。 他方、(ハ)は'A', 'B', 'C'がどこかにあるという点では同じでも、 ぜんぜん意味合いが異なる。