プロが教えるわが家の防犯対策術!

char* test のように宣言した変数に、
test = "abc" と代入するのは良くないのでしょうか?

また、変数test のメモリ領域は、代入時に"abc"の分で固定されるのでしょうか?
使いまわしをしないのであれば、問題ないでしょうか?
何かしら問題がありますでしょうか?

A 回答 (4件)

No3 の補足に対して



No2でちょっと大嘘書いてたようです
文法的に間違いはありませんが
やはり固定データ領域に対して記載したような変更を行うとすると
エラーになるのでやってはいけません(VC環境にて確認)

一旦作業用のバッファにコピーするなどしてから行うようにしてください
書かれてる追加質問に対してですが そのままではエラーになります
(これまでの内容と合わせてCのコードきちんと理解してますか?)

あくまで文法的な話として
*(p_test1+1) = 以下同様 とすればそうなります
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
(Cに慣れていなく、文法が不適切で恐縮です。)

何度もご回答して頂き、ありがとうございました!

お礼日時:2013/10/05 22:51

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言語といってもクロス系(組み込み系)のコンパイラの場合
固定データ自体が変更不可領域に割り当てられたりするため
上記のコードで問題があることはあります
    • good
    • 0
この回答へのお礼

ありがとうございます!

度々申し訳ないのですが最後にもう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 になるという認識で合っていますでしょうか?

お礼日時:2013/10/05 17:55

メモリの管理で誤解もしくは混乱されてるのではないかという気がします



"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」に書き換えられてしまわないのでしょうか?

(もしくは、他の方法で変数の値や、メモリの領域が不適切な状態になってしまうことはないのでしょうか?)
.

補足日時:2013/10/05 11:53
    • good
    • 0
この回答へのお礼

重複しますがありがとうございました!

お礼日時:2013/10/06 15:56

>test = "abc" と代入するのは良くないのでしょうか?



目的が合っていれば、問題ありません。

>また、変数test のメモリ領域は、代入時に"abc"の分で固定されるのでしょうか?

変数testには、プログラム中の文字列定数 "abc" の先頭アドレスが代入されます。

>何かしら問題がありますでしょうか?

文字列が代入されるわけではありませんので、文字列の書き換えなどは出来ません。

やりたいことと合っていれば問題は無いし、合ってなければ問題ありです。
    • good
    • 0
この回答へのお礼

ありがとうございます!

お礼日時:2013/10/05 12:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!