讀取記憶體地址時,如果判斷地址指向的值是空值?
比如
for i := 1 to 4 do
begin
pdz:=pointer($25366445);
pdz:=pointer(pdz^+i*4);
bb:=longint(pointer(pdz^));
end;
或者
asm
PUSHAD
MOV ECX,$25366445
MOV ECX,[ECX]
MOV EAX,I
MOV ECX, [ECX+EAX*4]
MOV bb,ECX
POPAD
end;
可能 pdz 指向的地址無效了,就出錯了,怎么先行判斷這個指標指向的地址無效呢
無效是會彈出 access violation address
uj5u.com熱心網友回復:
if PDWORD($25366445)^=0 thenuj5u.com熱心網友回復:
無法知道,也許那個地址(1位元組byte;2位元組word;4位元組cardinal)是有資料的,而且資料就是0又或者那個地址是3位元組(PAnsiChar),存放的資料就是#0#0#0
0并不能表示它不是真實資料。
uj5u.com熱心網友回復:
優雅點就使用windows apiIsBadReadPtr
暴力點可以用try ... except捕獲例外。
uj5u.com熱心網友回復:
對于記憶體,它就是一個芯片存貯器。記憶體地址,它就是芯片存貯器,某塊地方標注的位置。
記憶體的值,它就是芯片存貯器某塊地方,保存的資料。
嚴格意義上講,記憶體的值始終上有的,它的值:
(1)原始值;
(2)有效值;
(3)無效值。
比如,你的記憶體地址是未使用的區域內,它就是一個記憶體的原始狀態,全是0,或全是1(二進制值)。
如果你定義一變數var i:integer;,那就是指定i對應的地址是integer型別,它就是一個初始值0(十進制值)。如果 i:=10;操作,i對應地址的值就是10(十進制值)。
如果你定義一變數var ADO: TADOQuery;那么,ADO對應的地址為nil(初始值),你可以通過 if ADC=Nil then 陳述句進行判斷;當執行 ADO:=TADOQuery.create(application); 后,它就是一個有效值,ADC<>Nil了,此時它指向TADOQuery物件的地址。
總之,記憶體的比較深度的知識,它是涉及深度開發的知識。
uj5u.com熱心網友回復:
試試直接判斷是否NILuj5u.com熱心網友回復:
if not asigned(pdz) then轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98927.html
上一篇:delphi回圈問題
下一篇:為什么我訪問首頁提示列名無效。
