关于pchar(捡分数拉)(50分)

  • 主题发起人 主题发起人 aqi
  • 开始时间 开始时间
A

aqi

Unregistered / Unconfirmed
GUEST, unregistred user!
情况如下
--------------------
var
p:pchar
...
begin
...
getmen(p,1024);
p:=pchar('asdfffff');
freemem(p);//不对P进行任何操作则没事,P如有值则ERROR
...
end;
请帮忙!!!
 
你p:=pchar('asdfffff');后,p不在自相Getmem得到的内存,而是志向'asdfffff'
,当你freeMem时错。

//下面没错
var
p:pchar ;
begin
getmem(p,1024);
move('asdfffff',p^,Length('asdfffff'));
freemem(p);//不对P进行任何操作则没事,P如有值则ERROR
end;
 
但我要对P进行很多操作,每次都MOVE,不是很麻烦?
 
使用freemem(p)之前使用p:=nil;
我试过没问题。
 
使用freemem(p,x)之前必须将其=nil
如:
var
p: ^Dword;
getmem(p, Sizeof(Dword));
p^ := 4;
..........
p:= nil
freemem(p, sizeof(p);
 
Fudei: 的确不会有错误, 但先前分配的空间也没有释放的说呀. ^_^
其实对pchar的操作必须严格仿造C/C++中Char *的操作.
分配空间也不是用getmem函数的, 是用stralloc函数.
释放空间用strdispose函数, 赋值用strcopy函数, 可以进行类似+1的操作,
如:
p:=stralloc(100);
strcopy(p, '12345');
strcopy(pchar(p+5), '6789');
/* p='123456789' */
也可以用string做强制类型转换, 进行string操作, 比如:
edit1.text:=string(p);
不过这种用法一般不提倡.
所有pchar函数大多是str开头的, 而且不能和string类的函数混用.
 
像api提的问题,我搞不懂,你为什么要给他分配内存呢?p是一个指针,
对指针的操作和要分配内存是两码事,不是说用指针就得分配内存,
象前面的问题,只要:
var
P: pchar;
begin
...
p := 'aaa';
..
end;
就可以了,因为'aaa'已经有内存空间存放了,而p只是指向它而已。
 
我几乎不用指针,只是在有的api 中才用,太繁了,
我也觉得不用申请呀。
 
指针能不申请内存就用? 这样做迟早要吃大亏.
 
to cAkk:
就是这个,
p: PChar;
p := PChar(aString);
我常这么用,有错吗?请指教,
BTW, 你把我的那个 LineNumber 的分给分了吧,
我不知道怎么分好,你就看着办。谢谢。
 
没出错并不代表正确.
你应该用strpcopy来转换string->pchar
 
受益非浅!
 
to cakk: 这倒是。 谢谢。以后可要注意了,呵呵。
 
我以前用PCHAR从来不申请内存,
看来以后得学着点了。
 
其实早先我用pchar也从不申请内存,
只是本次字符串太长了,不申请内存便会崩溃
还有那位高手发表一下意见
 
试一试这样:
var
p:pchar;
s:string;
...
begin
...
getmen(p,1024);
s:='asdfffff';
p:=pchar(s);
...
freemem(p);
...
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
915
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
621
import
I
后退
顶部