pchar初级问题(50分)

  • 主题发起人 主题发起人 小痴
  • 开始时间 开始时间

小痴

Unregistered / Unconfirmed
GUEST, unregistred user!
请高手指点一二
下面这段代码,运行时报告错误,问题出在strdispose(ss),
删掉这句的话,调试运行windows崩溃了报了一个vxd的错误。
var
ss:pchar;
begin
ss:=pchar('');
strnew(ss);
gettemppath(20,ss);
edit1.text:=ss;
strdispose(ss);
end;
另:下面这段代码报告EoutofMemory,问题出在ss+'string'上,why?
var
ss:pchar;
begin
ss:=pchar('');
GetTempPath(20,ss);
edit1.text:=ss+'string';
end;
最后下面这段代码完成了我的要求,不过搞不懂上面的代码为何通不过。
var
ss:pchar;
begin
ss:=pchar('');
gettemppath(20,ss);
getmem(aa,length(ss)+10);
strcopy(aa,ss);
strcat(aa,'string');
edit1.text:=aa;
freemem(aa);
end;
 
> ss:=pchar('');
> GetTempPath(20,ss);
> edit1.text:=ss+'string'
既然ss:=pchar('')当然ss是pchar类型了,怎么能edit1.text:=ss+'string'?
又成了string类型了???

edit1.text:=ss也不对,edit1.text是string ,而ss是pchar,而者是不能直接
付值的。
 
pchar真是很奇怪的
请看:
var p:pchar;
begin
getmem(p,10);
p:='';
if p='' then // ...这是错误的!
if p+'a'='a' then // ...if 语句应该这样写才行。
您要是不信,试一下就知道了
 
主要的错误就是使用前没有申请内存.pchar是指针,一定要申请内存再使用.
getmem(PCharString,length)
....
freemem(PCharString)
 
pchar是对C中char *的兼容. 所以一切操作应该遵循C中的规范.
比如: stralloc(等同malloc), strcomp(等同strcmp),
strcopy(等同strcpy)等.

www: 对pchar进行比较是用strcomp的.

另外, pchar和string的转换可以采用pchar(string1)或string(pchar1)等
方式, 或采用函数strpas等函数
 
www:
我看书上所写pchar与string可同时出现在表达式中,pchar会自动转换。
edit1.text:=ss绝对可行。
cakk:我用strnew来申请内存可以吗?而且在strdispose前设置断点,程序很正常。
既然用strnew,当然得用strdispose?
我刚开始学编程,谢谢大家帮助。
 
PChar是指针,使用前一定要分配内存,用完释放.

begin
ss := PChar('');//没有分配前赋值,将程序的地址空间中某处写入了值,
// 导致程序运行异常,错误不可预测.
end;
The StrNew function allocates a copy of Str on the heap.

If Str is nil or points to an empty string, StrNew returns a pointer to a new empty string.

Otherwise, StrNew makes a duplicate of Str, obtaining space with a call to the StrAlloc procedure, and returns a pointer to the duplicated string.

The allocated space is StrLen(Str) + 5 bytes long.
The StrDispose procedure is provided for backward compatibility only

分配内存建议用GetMem,FreeMem.

EoutMemory是没有分配内存导致的.

如果你用Delphi4
建议这样写
var
SS : string;
begin
SetLength(ss,255);
GetTempPath(255,PChar(ss));
Edit1.Text := SS;
end;

 
GetTempPath(255,PChar(ss));
加入一句 ss := String(Pchar(ss));调整ss的长度.
GetTempPath是WindowAPI的函数,Delphi不知道ss的长度已经变.
如果不加 那一句, Length(ss) 返回255,加了,Length(ss)返回TempPath的
真正长度.
 
多人接受答案了。
 
后退
顶部