- ベストアンサー
Char* に文字列代入
char* test のように宣言した変数に、 test = "abc" と代入するのは良くないのでしょうか? また、変数test のメモリ領域は、代入時に"abc"の分で固定されるのでしょうか? 使いまわしをしないのであれば、問題ないでしょうか? 何かしら問題がありますでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No3 の補足に対して No2でちょっと大嘘書いてたようです 文法的に間違いはありませんが やはり固定データ領域に対して記載したような変更を行うとすると エラーになるのでやってはいけません(VC環境にて確認) 一旦作業用のバッファにコピーするなどしてから行うようにしてください 書かれてる追加質問に対してですが そのままではエラーになります (これまでの内容と合わせてCのコードきちんと理解してますか?) あくまで文法的な話として *(p_test1+1) = 以下同様 とすればそうなります
その他の回答 (3)
- koi1234
- ベストアンサー率53% (1866/3459)
No2です 補足に対して なんとなく意味は分かりますがコード自体がめちゃくちゃと違いますか? (コンパイラ依存かな?) それは置いておくとして >val_test2 の1文字目の「d」の領域が、 >「x」に書き換えられてしまわないのでしょうか? 書き換えられません 記載されたコードの大まかな動作としては以下のようになります (コード自体もおかしいのであくまでイメージとしてとらえてください) char* p_test1 = null; (NULL かな?) を行うと アドレス 200番地が p_test1 の変数として割り当てられ 200番地のデータとして null がセットされます メモリの100番地から順番に以下の固定データが割り当てられます (あなたが書いたイメージそのまま) abcdefxxxx がメモリ100番から順次格納される p_test1 = &val_test1; を行うと 200番地のデータとして 100 がセットされます 他の代入を行っても書き換わるのはあくまで200番地のデータだけで 固定データが格納されてる100番台のアドレスのデータには何も影響ありません 変な書き換えするとプログラム暴走及びバグの原因になりますが もしそういった書き換えをしたいのであれば p_test1 = &val_test1; *p_test1 = 'x'; と書けば アドレス100の 'a' のデータが 'x'に変わります 標準的な話ではありませんが C言語といってもクロス系(組み込み系)のコンパイラの場合 固定データ自体が変更不可領域に割り当てられたりするため 上記のコードで問題があることはあります
お礼
ありがとうございます! 度々申し訳ないのですが最後にもう1つだけお願いします。 p_test1 = &val_test1; *p_test1 = 'x'; と書いて、アドレス101の 'a' のデータが 'x'に変わるということですが、 val_test1の3文字のアドレス101番地~103番地、 val_test2の3文字のアドレス104番地~106番地だとしたら、 *p_test1 = 'x'; //101 *p_test1+1 = 'y'; //102 *p_test1+2 = 'z'; //103 *p_test1+3 = 'v'; //104 を実行したら、 val_test1 は、xyz になり、 val_test2 は、vef になるという認識で合っていますでしょうか?
- koi1234
- ベストアンサー率53% (1866/3459)
メモリの管理で誤解もしくは混乱されてるのではないかという気がします "abc" という固定の文字列データがメモリに確保されたうえで そのメモリの先頭アドレスが test の変数に代入されるだけです ですので test への値の再設定(使い回し)にはなにも問題ありません
お礼
重複しますがありがとうございました!
補足
ありがとうございます。 char* p_test1 = null; char* p_test2 = null; char* p_test3 = null; char[3] val_test1 = "abc"; char[3] val_test2 = "def"; char[4] val_long_str = "xxxx"; p_test1 = &val_test1; p_test2 = &val_test2; p_test3 = &val_long_str; と書いたとして、 val_test1 の先頭アドレスが メモリの101番地、 val_test2 の先頭アドレスが メモリの104番地に格納されたとします。 - - - - - - - - - - - 101番地 a 102番地 b 103番地 c 104番地 d 105番地 e 106番地 f - - - - - - - - - - - そして、 p_test1 = &val_long_str; もしくは、 p_test1 = p_test3 のようにしたら、 val_test2 の1文字目の「d」の領域が、 「x」に書き換えられてしまわないのでしょうか? (もしくは、他の方法で変数の値や、メモリの領域が不適切な状態になってしまうことはないのでしょうか?) .
- notnot
- ベストアンサー率47% (4900/10358)
>test = "abc" と代入するのは良くないのでしょうか? 目的が合っていれば、問題ありません。 >また、変数test のメモリ領域は、代入時に"abc"の分で固定されるのでしょうか? 変数testには、プログラム中の文字列定数 "abc" の先頭アドレスが代入されます。 >何かしら問題がありますでしょうか? 文字列が代入されるわけではありませんので、文字列の書き換えなどは出来ません。 やりたいことと合っていれば問題は無いし、合ってなければ問題ありです。
お礼
ありがとうございます!
お礼
回答ありがとうございます。 (Cに慣れていなく、文法が不適切で恐縮です。) 何度もご回答して頂き、ありがとうございました!