掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ポインタに代入した時のアドレス (ID:202)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
PAPYさん、始めましてm(__)m 前に書いたサンプルでは、短くするために無関係と思われる部分を 省略してしまったので、現象がうまく再現されませんでした。 実際に試したプログラムでは、 buf := PChar(str); の後で下のような「strの要素にアクセスするコード」が入っていました。 ListBox1.Items.Add(IntToHex(Integer(@str[1]), 8)); つまり、buf := PChar(str) を実行した段階では bufとstrの値は同じになりますが、このコードを実行した後では strのアドレスが変わっていたのです。 $00462FB4 ← 最初のアドレス $00BE08D4 ← 変わった後のアドレス なぜアドレスが変わってしまうのか不思議ですが、変わった後の方が正しい アドレスのようです。 以下のプログラムでその現象が確認出来るはずなんですが... procedure TForm1.Button1Click(Sender: TObject); var str: string; buf: PChar; begin str := 'abcdefghij'; buf := PChar(str); // ここで bufとstrの値は同じになるが... try buf[1] := '1'; // ここで書き込みエラーが発生するので buf[3] := '3'; // bufの値(アドレス) が不正と思われる finally ListBox1.Clear; // str と buf の値(アドレス)を確認 ListBox1.Items.Add(IntToHex(Integer(str), 8)); ListBox1.Items.Add(IntToHex(Integer(buf), 8)); // このコードでstrのアドレスが変わってしまう(ナゼ?) ListBox1.Items.Add(IntToHex(Integer(@str[1]), 8)); // str[1] := str[1]; // これでもstrのアドレスが変わる(ナゼ?) buf := PChar(str); // また bufに strの値を代入する buf[1] := '1'; // 今度はエラーにならない buf[3] := '3'; // 再確認してみると str の値(アドレス)が変わっている ListBox1.Items.Add(IntToHex(Integer(str), 8)); ListBox1.Items.Add(IntToHex(Integer(buf), 8)); ListBox1.Items.Add('str[1]='+ str[1]); ListBox1.Items.Add('buf[1]='+ buf[1]); ListBox1.Items.Add(str); ListBox1.Items.Add(buf); end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.