No.4ベストアンサー
- 回答日時:
No3 の補足に対して
No2でちょっと大嘘書いてたようです
文法的に間違いはありませんが
やはり固定データ領域に対して記載したような変更を行うとすると
エラーになるのでやってはいけません(VC環境にて確認)
一旦作業用のバッファにコピーするなどしてから行うようにしてください
書かれてる追加質問に対してですが そのままではエラーになります
(これまでの内容と合わせてCのコードきちんと理解してますか?)
あくまで文法的な話として
*(p_test1+1) = 以下同様 とすればそうなります
No.3
- 回答日時:
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 になるという認識で合っていますでしょうか?
No.2
- 回答日時:
メモリの管理で誤解もしくは混乱されてるのではないかという気がします
"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」に書き換えられてしまわないのでしょうか?
(もしくは、他の方法で変数の値や、メモリの領域が不適切な状態になってしまうことはないのでしょうか?)
.
No.1
- 回答日時:
>test = "abc" と代入するのは良くないのでしょうか?
目的が合っていれば、問題ありません。
>また、変数test のメモリ領域は、代入時に"abc"の分で固定されるのでしょうか?
変数testには、プログラム中の文字列定数 "abc" の先頭アドレスが代入されます。
>何かしら問題がありますでしょうか?
文字列が代入されるわけではありませんので、文字列の書き換えなどは出来ません。
やりたいことと合っていれば問題は無いし、合ってなければ問題ありです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- Java java final 1 2022/06/10 22:49
- Excel(エクセル) Excelの関数で実現可能か知りたいです 5 2023/08/06 08:58
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
processing エラーで、 "cannot...
-
C言語 列挙型(enum型)変数について
-
[VBS]変数を定数に変換する方法...
-
java final
-
テキストボックスの値を変数に...
-
数値計算??
-
StringReaderのサンプルプログ...
-
python の 連鎖代入の文法
-
vba 最大値 条件分岐
-
変数宣言と初期値代入の場所に...
-
関数に変数に代入するメリット
-
インクリメント演算子の前置(+...
-
整数xxxが大き過ぎますというエ...
-
C言語 アロー演算子について質...
-
親ウィンドウの情報をインライ...
-
EXCEL/VBA 変数の値をクリップ...
-
「%」を使って、偶数か奇数かを...
-
無名関数のメリットがよくわか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
C言語 列挙型(enum型)変数について
-
EXCEL/VBA 変数の値をクリップ...
-
整数xxxが大き過ぎますというエ...
-
テキストボックスの値を変数に...
-
[VBS]変数を定数に変換する方法...
-
Variant型で宣言してるのにEmpt...
-
jsp~jspにhiddenを使って変数...
-
processing エラーで、 "cannot...
-
python の 連鎖代入の文法
-
i++と++i ってどう違うのですか?
-
プログラミングで変数と関数の...
-
C言語 アロー演算子について質...
-
「%」を使って、偶数か奇数かを...
-
JavaScriptをURLから直接実行し...
-
VBA 1行で複数の代入を行った...
-
ExcelのVBAでをA列に第0〜19項...
-
コマンドプロンプト バッチ|結...
-
無名関数のメリットがよくわか...
おすすめ情報