pchar 把我弄蒙了!!(10分)

  • 主题发起人 主题发起人 jhb
  • 开始时间 开始时间
J

jhb

Unregistered / Unconfirmed
GUEST, unregistred user!
pchar 把我弄蒙了!!
下面的程序你总不会认为对吧??
var ww1:pchar;
ww22:pchar;
begin
getmem(ww,1);//申请了一个字符空间
strpcopy(ww,'abcdefghij');//使用了10个字符赋值
label1.caption:=strpas(ww);
//输出结果“abcdefgh”八个字符
getmem(ww2,2);//申请了2个字符空间
strpcopy(ww2,'abcdefghijklmnop');//使用了16个字符赋值
//qrstuvwxyz');
label2.caption:=strpas(ww2);
{输出结果“abcdefgh”八个字符
如果WW2申请了12个字符空间,使用16个字符赋值,
那么运行报错,“违反地址操作”
如果WW2申请了14个字符空间,使用16个字符赋值,
输出结果“abcdefghijklmnop”16个字符}
freemem(ww1);
freemem(ww2);
end;

其实这三种操作都是非法,strpcopy为何检验不出?
为何 第一,第三种非法操作不报错,竟然可以运行!!
(我还专门重新启动了机器,结果相同)

误操作引来的问题,想知道为什么,又看不了VCL原码;
想请那位大虾解释一下,
初学乍练,问题太多,不敢给太多分,望以侠义为重,
救人于水火!!
 
使用没有分配的内存空间,结果是不可预料的!不见得马上抱错!
 
pchar只是一个指针(指向一个地址)
strpcopy不作任何边界检查,只是向指定地址开始copy n个字节
如果你分配的内存大小不够的话有两种可能:
1. 该块内存后面的内存未使用, strpcopy正常执行,但得到的结果不确定(该块内
存之后的未分配内存可能由于其它原因改变了)
2. 该块内存后面的内存被其它变量占用,strpcopy时系统出错。
这就是你有时运行strpcopy不报错有时出错的原因
至于显示的内容,则极有可能系统由于特殊原因(或某些操作)正好使得pchar指向地
址之后的第9个字节为#0(比如未分配内存块的对齐或重整等内部操作)。所以显示了
前8个字符。
 
用GetMem为PChar分配内存, size应该为StrLen+5. 因为PChar字符串结构是头两个
字节用来表示PChar字符串的所占长度, 最后至少还要有一个表示字符串结束的0.
 
huaizhang搞错了吧?
pchar型没有前导长度的。pchar型字符串就是靠#0来区分结尾的(开始就是pchar指向
的地方)
有前导长度的是string型和pstring型(没有#0结尾的)这种类型的字符串中允许出现
#0字符。
 
前导长度是有的, 这就是PChar与Pointer的区别. 但是PChar的值是指向第一个字符.
那个长度不是实际字符数, 而是字符串的最大长度.
 
前导长度是有的!是delphi的长字符形,不是Pchar!不过多分配一点保险!
 
那么pchar(pointer(buffer))^指向哪里?buffer的第一个字节地址?还是跳过长度之后的地址?
var
x: pchar;
begin
// initialize x here
x:=x+5;
end;

x^指向?
如果说pchar带长度的话, 这个长度也不在分配的内存块里(应该在变量表里吧?)
 
See Delphi Help, look for "StrAlloc"
 
hehe, 原来是后导长度,而且只是StrAlloc才有这玩意,这表明pchar本身还是不带长度
的嘛。(看看delphi中关于GetMem里给的那个例子吧)
 
pchar是不带长度的,但delphi长字符类型是带长度的!
pchar<>string;
string前有两个整型,记录长度和引用记数!
 
如果不是要申请很大的空间,我建议用:
Temp : Array[0..???] of char;
 
大虾们,如果以申请了getmem(ww,20)个字符空间,
不够用,如何在其后再伸请些空间??
 
再getmem()把原来的copy!
我建议使用string类型,处理函数多,不用过多考虑内存!可以转变pchar(string)
 
ReallocMem(var P: Pointer;
Size: Integer);
 
pchar 就是 CHAR叔祖,没有前导长度
ShortString/String(d2)有STRING[0]
同意DELPHI FAN2,现在的PCHAR用处没有D1那么明显了,也不复杂了:)
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部