私は1週間前にC++で冒険を始めました。私はC++についてたくさん読みました。私は次のことを実験していました:
char * String1 = "abcdefgh";
次に、次の方法でその値を変更しようとしました。
String1[2] = 'f';
これにより、手に負えない例外が発生しました。ただし、次の結果は適切に実行されます。
char String2[9]="abcdefgh";
String2[7]='s';
DUMPBINを使用して、上記のコードを使用して生成されたバイナリに関する情報を抽出しようとしました。DUMPBINはVisualStudioツールです。/ ALLオプションを使用して、バイナリに含まれるすべての情報を抽出しました。
RAWDATAセクションに「abcdefgh」の2つのインスタンスが表示されました。そして、私はその理由を理解しています。
私の質問は次のとおりです。
1)String1とString2はどちらも基本的に、同じ文字シーケンスの2つの異なるインスタンスへのポインターですが、String1の操作が正当な操作ではないのはなぜですか?
2)コンパイラが変数名とその値をマッピングするためのSYMBOLTABLEを生成することを知っています。Windows OSでシンボルテーブルを視覚化するツールはありますか?
3)文字シーケンスの代わりに整数の配列がある場合、それはRAWDATAで見つけることができますか?
RAWDATAでも次のことがわかります。
Unknown Runtime Check Error.........
Stack memory around _alloca was corrupted.......
....A local variable was used before it was initialized.........
....Stack memory was corrupted..
........A cast to a smaller data type has caused a loss of data.
If this was intentional, you should mask the source of the cast with the appropriate bitmask.
これらのものはどのようにしてバイナリ実行可能ファイルに入りますか?これらのメッセージをバイナリ(明らかに読み取り可能ではありません)に含める目的は何ですか?
編集:私の質問1)には、次のことを意味するために使用されるINSTANCESという単語があります。
文字シーケンス「abcdefgh」は、大文字でない英語のアルファベットのセット、つまり{a、b、...、y、z}から派生しています。このシーケンスは2回インスタンス化され、AとBなどの2つのメモリ位置に格納されます。String1はA(仮定)を指し、String2はBを指します。この質問には概念的な取り違えはありません。
私が理解したかったのは、メモリ位置AとBの属性の違い、つまり、それらの1つが不変である理由でした。