读取内存地址时,如果判断地址指向的值是空值?
比如
    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

解决方案 »

  1.   

    if PDWORD($25366445)^=0 then
      

  2.   

    无法知道,也许那个地址(1字节byte;2字节word;4字节cardinal)是有数据的,而且数据就是0
    又或者那个地址是3字节(PAnsiChar),存放的数据就是#0#0#00并不能表示它不是真实数据。
      

  3.   

    优雅点就使用windows api
    IsBadReadPtr 暴力点可以用try ... except捕获异常。
      

  4.   

    对于内存,它就是一个芯片存贮器。
    内存地址,它就是芯片存贮器,某块地方标注的位置。
    内存的值,它就是芯片存贮器某块地方,保存的数据。严格意义上讲,内存的值始终上有的,它的值:
    (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对象的地址。
       
        总之,内存的比较深度的知识,它是涉及深度开发的知识。
      

  5.   

    试试直接判断是否NIL
      

  6.   

    if not asigned(pdz) then