VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 2004/08/28(Sat) 17:27
投稿者魔界の仮面弁士
Eメール
URL
タイトルRe: 変数の内容のメモリ上の扱いについて

> 今日は、変数の内容がメモリ上で、どのように扱われてるのか
> 色々確認したいのです。

それは、何のためにでしょうか?
どのような状況を想定しているのかによってデータの扱われ方は変わってきます。

整数の場合は、さほど差は無いのですが、特に文字列型やユーザー定義型の場合、
APIに引き渡す場合、OLE APIに引き渡す場合、バイナリファイルにPut#する場合とで
データの配置が変化する事がありますので…。


> dim Suu as Integer
> Suu=40
> の例では、メモリの内容は
> 0010,1000になるんですよね?
2進数表記でいえば、そうなりますね。ただ、Integer は2バイトなので、
  0000,0000,0010,1000
と表記した方が良いかも知れませんけれども。
16進数表記で言えば、&H0028 といった所でしょうか。

で、そのデータが、
  Debug.Print VarPtr(Suu)
で示されるメモリ位置に、2バイト分書き込まれていますので、
  VarPtr(Suu) + 0 の位置に書かれているデータ …… &H28 ( 40)
  VarPtr(Suu) + 1 の位置に書かれているデータ …… &H00 (  0)
のように、メモリ上に配置されています。


> dim LSuu as Long
> Long=50000
> 1100,0011,0101,0000と扱われますよね?
2進数なら 0000,0000,0000,0000,1100,0011,0101,0000。
16進数なら 00 00 C3 50 ですかね。
  Debug.Print CLng("&H0000C350") = 50000&

そのデータが、
  Debug.Print VarPtr(LSuu)
で示されるメモリ位置に、4バイト分書き込まれている事になりますので、
  VarPtr(LSuu) + 0 の位置に書かれているデータ …… &H50 ( 80)
  VarPtr(LSuu) + 1 の位置に書かれているデータ …… &HC3 (195)
  VarPtr(LSuu) + 2 の位置に書かれているデータ …… &H00 (  0)
  VarPtr(LSuu) + 3 の位置に書かれているデータ …… &H00 (  0)
のように配置される事になります。


> dim Str2 as String
> Str2="b"
> の場合。
この場合、
  Debug.Print VarPtr(Str2)
で示されるメモリ位置からの4バイト分に、その変数が保持する
文字列値のメモリ位置が書き込まれています。

なお、そのアドレスが示すメモリ位置に格納されている情報は、
  Debug.Print StrPtr(Str2)
で得られる値と常に等しく、これが文字列"b"の先頭アドレスを意味しています。


そして、この文字列アドレスが示す値が &H00000000 だった場合、この変数の中身は
空文字列、すなわち vbNullString であるという事になります。
そして、文字列のアドレス値が &H00000000 以外だった場合には、この変数 Str2 の中に、
「0文字以上の文字列」が含まれている事になるわけです。


この時、Str2 に、何らかの(vbNullString以外の)文字列が含まれている場合、
そこに含まれるデータの長さが、
  Debug.Print StrPtr(Str2) - 4
で示されるメモリ位置からの4バイト分に格納されています。

例えば、このアドレスが示すメモリ位置に格納されている情報が「0」と
なっていれば、長さゼロの文字列 "" が格納されている事になります。
今回の場合は、"b" が格納されているため、LenB("b") = &H00000002 なので、
  StrPtr(Str2) - 4 が示す位置に書かれているデータ …… &H02 (  2)
  StrPtr(Str2) - 3 が示す位置に書かれているデータ …… &H00 (  0)
  StrPtr(Str2) - 2 が示す位置に書かれているデータ …… &H00 (  0)
  StrPtr(Str2) - 1 が示す位置に書かれているデータ …… &H00 (  0)
といった感じですね。

そして、"b" の場合、AscW("b") = &H0062 ですので、2バイト分のデータが
  StrPtr(Str2) + 0 が示す位置に書かれているデータ …… &H62 ( 98)
  StrPtr(Str2) + 1 が示す位置に書かれているデータ …… &H00 (  0)
のように格納されます。


もし、Str2 = "あい" だったなら、LenB("あい") = &H00000004、そして
AscW("あ") = &H3042、AscW("い") = &H3044 なので、
  StrPtr(Str2) - 4 が示す位置に書かれているデータ …… &H04 (  4)
  StrPtr(Str2) - 3 が示す位置に書かれているデータ …… &H00 (  0)
  StrPtr(Str2) - 2 が示す位置に書かれているデータ …… &H00 (  0)
  StrPtr(Str2) - 1 が示す位置に書かれているデータ …… &H00 (  0)

  StrPtr(Str2) + 0 が示す位置に書かれているデータ …… &H42 ( 66)
  StrPtr(Str2) + 1 が示す位置に書かれているデータ …… &H30 ( 48)
  StrPtr(Str2) + 2 が示す位置に書かれているデータ …… &H44 ( 68)
  StrPtr(Str2) + 3 が示す位置に書かれているデータ …… &H30 ( 48)
という感じです。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -