对以NULL结束的字符串的疑惑 ( 积分: 100 )

  • 主题发起人 主题发起人 lixiaohui
  • 开始时间 开始时间
L

lixiaohui

Unregistered / Unconfirmed
GUEST, unregistred user!
var
myarr:array [0..2] of char;
{$H+}
mystr:string;
begin
mystr:="123";
strpcopy(mystr,mystr);
end;
大家说这样会不会造成myarr内存溢出吗
mystr不是指以NULL结束的字符串吗,如果赋给myarr,但是myarr只有3个字节的空间,这样会溢出吗?
 
mystr不是指以NULL结束的字符串吗?
string不是以nil为结尾的
mystr占4个字节
 
请问如何能检查出是否有内存溢出,因为我试了试,程序不会报错
 
strpcopy([blue]mystr[/blue],[red]mystr[/red]);
兩個都是mystr,你并沒有給myarr拷貝啊?怎么可能出錯。
 
strpcopy(myarr,mystr);
不好意思,我写错了,是这样的
 
如果你寫的是StrPCopy(myarr, mystr)的話,其實也不會出錯的,因為你雖然讓array of char不是以#0結尾,但還是完整的寫了3個字節(你的array聲明的長度就是3),所以不會出現內存溢出的問題。只不過當你試圖用PChar的方式讀myarr的時候,可能會讀到越界的范圍內(那里的數據是棧內上次寫入的數據,此刻是無效且無用的數據),會導致運算錯誤,或者會出現著名的AV錯誤。
 
str:string;
delphi里的string并不以null结束, 而是在str的头部使用4字节来保存字串长度~
delphi是按照这个长度取出字串,而不是搜索null字符(和C不同哦)

但pchar, pansichar却是搜索null字符.....

strpcopy(myarr,mystr);其实就是将mystr--->pchar ,再在字串尾加上#0

myarr是3byte ,无法加上#0,所以当把myarr转化为string时会出现AV
 
所以borland建议 当把string-->pchar时最好现在string尾部加#0
p:pchar;
str:string;

p:=pchar(str+#0);
 
默认的string类型在尾部delphi是会自动维护有一个#0符的
 
p:=pchar(str+#0)

这样做难道不是多出一个#0了?
 
p:=pchar(str+#0)

这样做难道不是多出一个#0了?

当然不会,不管你加了多少个#0.....搜索到第一个#0,字串就结束了
 
写程序的时候好象没有考虑过#0的问题;
程序也没因此而出错
 
var
myarr:array [0..2] of char;
{$H+}
mystr:string;
begin
mystr:='123'
//这样的字符串常量Delphi会自动给结尾处加上#0的,前面也会自动补上长度
strpcopy(mystr,mystr);
end;
 
结贴,谢谢各位了
 
我只是说"所以borland建议 当把string-->pchar时最好现在string尾部加#0
"

没说不加会错啊
 
Borland可没有这样建议过。
因为String和字符常量Borland都给你加好了#0的结尾。
自己手动加存属画蛇添足
 
mystr:='123'
//这样的字符串常量Delphi会自动给结尾处加上#0的,前面也会自动补上长度

不要乱说!
 
后退
顶部