读取内存地址时,如果判断地址指向的值是空值?
比如
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
比如
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
又或者那个地址是3字节(PAnsiChar),存放的数据就是#0#0#00并不能表示它不是真实数据。
IsBadReadPtr 暴力点可以用try ... except捕获异常。
内存地址,它就是芯片存贮器,某块地方标注的位置。
内存的值,它就是芯片存贮器某块地方,保存的数据。严格意义上讲,内存的值始终上有的,它的值:
(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对象的地址。
总之,内存的比较深度的知识,它是涉及深度开发的知识。