Delphi中居然没有判断PChar指向的地址无效的函数?(200分)

  • 主题发起人 主题发起人 delphiroad
  • 开始时间 开始时间
D

delphiroad

Unregistered / Unconfirmed
GUEST, unregistred user!
var
pp:pchar;
ss:string;
begin
pp:='12345';
ss:=pp;//不会出错
end;

var
pp:pchar;
ss:string;
begin
ss:=pp;//要出错,Access violation at address之类的错误
end;

现在的问题是,怎么判断pp是无效的?我用了Assigned函数,但不行,因为pp不是nil

注:实际的情况中,由于pp是另一个组件的属性,我也无法修改原代码,所以我根本无法使用类似pp:=nil之类的方法来给它初始化。只能是判断了。
 
pp 做临时变量不会被初始化为nil 而是会被首先给予一个随机值(事实上除了String类型外其他都有这样的问题) 这样会出现问题
但你把他最为一个类的成员变量就会得到初始化操作

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
pp2:pchar
//这个PP2 会得到初始化 从而为nil
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
pp:pchar
//<-- 这个pp一开始绝对不是nil 而是一个随机值
ss:string;
begin
ss:=pp;
end;

判断是否无效用Assigned和是否等于nil都是可以的
 
我这里测试在D7可以运行。
if not (pp=nil) then
ss:=pp;
 
要养成习惯,局部变量一定要赋初始值
其实,DELPHI编译时的警告信息就已经提醒你了,你还不初始化就是你的错
 
不行,我这里出现:
Access violation at address 0A22949D in module 'project1.exe'. Write of address 0A2C2C28

关键是这个pp是一个activex控件的属性,我又不能初始化它
 
当这个属性的确有值的时候,读它是不出错的,只是这个值没有的时候(dll没有给它初始化时),我在程序里读它就出问题了。
现在我就是想判断它究竟有没有值,有的话再读,怎么做?
 
忘记感谢以上几位的回答,可惜我的问题还是没有解决。

不过我想我说清楚了
 
pp是被随机赋值,读取到#0为止,因此可能出错,也可能不出错。
 
那什么时候出错呢?我的意思是,怎么避免出错?
还是说没办法了
 
用IsBadReadPtr函数可以检测内存是否可以读,赋值的时候循环到#0为结尾,就可能读到了不可读的内存,当然也可能幸运的读到了可读的内存。
 
delphi不建议用指针,呵呵;
 
接受答案了.
 
后退
顶部