帮忙分析下这个问题的原因(100分)

  • 主题发起人 主题发起人 zhjwjan
  • 开始时间 开始时间
Z

zhjwjan

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure a;
var
chars: array [0..5] of char;
begin
strpcopy(chars, '12345678');
end;
执行完上述过程后会出现”access violation“的错误。我对这个错误的原因不能解析得很
好,哪位可以帮忙解析下?
 
你的Char数组长度为6,而赋了8个数字,一定出错呀。
 
同意YZHSHI的看法﹒
 
赋值时是不会错的,我指的是执行完这个过程后,回收变量的空间时发生错误。
 
strpcopy函数是将pascal类字符串复制为以null结束的字符串;
所以在你的代码中 strpcopy(chars, '1234');字符最多是四个,扩大你的数组再试![:D]
 
procedure a;
var a:pchar;
begin
try
getmem(a,8);
strpcopy(a,'12345678');
finally
freemem(a);
end;
end;
 
你能回答“为什么回收变量空间时发生错误”吗?
 
何为回收空间?
其实,对于这种情况,最好是使用pChar,使用以前分配空间,结束后释放空间。
代码如ugvanxk所写的即可。
 
我现在不是要修改这段程序,是要原因
 
StrPCopy copies a Pascal-type string Source into a null-terminated string Dest. It returns a pointer to Dest.

StrPCopy does not perform any length checking.

The destination buffer must have room for at least Length(Source)+1 character
使用了pchar ,却没有为pchar 分配空间
 
yes, I know all about these. In fact, the sentence "strpcopy(chars, '12345678');" is successfully
executed and the error occurs after the procedure. Why?
 
首先,我不明白你怎么这么喜欢用strpcopy这个函数。
其实
chars: array [0..5] of char
这种声明就是声明chars的类型为 PChar, 只是多加了个限制。
所以strpcopy(chars, '12345678')
表面上是正确的。
但赋值时它已超出了你声明的范围,因为赋值时系统当它是PChar
这是这个函数的声明。
function StrPCopy(Dest: PChar
const Source: string): PChar

执行StrPCopy时,Dest不知道你对参数加个限制。结果是内存溢出。
这个问题是可大可小的啦。小的就是这那种
“回收变量空间时发生错误”。 大的就可能系统崩溃。

明白了吗。那个Aspack你还没给分我呢。
 
thank you all
 

Similar threads

回复
0
查看
1K
不得闲
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
875
DelphiTeacher的专栏
D
后退
顶部