掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
WriteFileの引数const Bufferとは何ですか? (ID:18775)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> Label1.Caption := IntToHex(Cardinal(PChar(s)), 8); > Label2.Caption := IntToHex(Cardinal(s), 8); > が同じ値をしめすことから、やはり、文字列の先頭へのアドレスを保持しているんですよね。 違います。ブレイクポイントを仕掛けて、sのアドレスを確認してみてください。 また、 Label1.Caption := IntToHex(Cardinal(PChar(s)), 8); Label2.Caption := IntToHex(Cardinal(Addr(s)), 8); こちらに入れ替えて、同じようにブレイクポイントを仕掛けて確認してみてください。 ポインタへキャストする際に、すでに純粋なsへのポインタではなくなっています。 Stringに値を入れて、CPUウィンドウで確認すると動きがよくわかります。 例として次のようなプログラム。 var s: String; p: PCHAR; begin s := ''; s := 'abc'; p := PCHAR(s); ... end; s := 'abc'にブレイクポイントをしかけ、実行してみましょう。 ブレイクポイントでとまったら、sのアドレスをデバッグインスペクタで確認してください。 sのアドレスが12F588だとします。 このアドレスの値は、00000000です。 次に、 s := 'abc'; を1行分実行させます。 私の環境では004BDB80でした(毎回変わるので、CPUウィンドウで確認してください)。 このアドレスをデータペインで見てみると、 61 62 63 00 ....(ASCII部では、a b c . . .) となり、ようやく実体にたどり着けます。 もう1行、 p := PCHAR(s); を通してみてください。 このpの値は、004BDB80となっているはずです。 p := PCHAR(s); と、 p := PCHAR(PBYTE(s)); に、違いがあることに注意してください。Stringのキャストは、そのままの形でキャストされるのでなく、文字列の実体へのポインタへ変換されます。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.