procedure pd(var p:pchar); //过程功能:把字符数组,放到参数p中返回
var
arrChar:array[0..2] of char;
i:integer;
str:string;
begin
for i:=0 to 2 do
arrChar[i]:='a';
str:=arrChar;
p:=PChar(str); //单步执行的时候,这里显示的是3个a,是正确的
end;
//以下是调用过程pd(var p:pchar);
procedure TForm1.Button3Click(Sender: TObject);
var
p:pchar;
begin
pd(p);
showmessage(strpas(p));
//只显示两个a,但是我利用单步执行,在过程中查看的时候,过程pd中,p是显示3个a.怎么回事???
//为什么这里只显示两个a???????????
end;不会是电脑出毛病了吧?我重新启动一下电脑看看???
var
arrChar:array[0..2] of char;
i:integer;
str:string;
begin
for i:=0 to 2 do
arrChar[i]:='a';
str:=arrChar;
p:=PChar(str); //单步执行的时候,这里显示的是3个a,是正确的
end;
//以下是调用过程pd(var p:pchar);
procedure TForm1.Button3Click(Sender: TObject);
var
p:pchar;
begin
pd(p);
showmessage(strpas(p));
//只显示两个a,但是我利用单步执行,在过程中查看的时候,过程pd中,p是显示3个a.怎么回事???
//为什么这里只显示两个a???????????
end;不会是电脑出毛病了吧?我重新启动一下电脑看看???
//怎么回事????我重新启动了电脑,问题依旧。
procedure TForm1.Button2Click(Sender: TObject);
var
str:string;
arrChar: array[0..2] of Char;
i:integer;
p:pchar;
begin
for i:=0 to 2 do
arrChar[i]:='5';
str:=arrChar;
p:=pchar(str);
showmessage(strpas(p));
end;
procedure pd(var p:PChar);
var
arrChar:array[0..2] of char;
begin
for i:=0 to 2 do
arrChar[i]:='a';
//怎么把arrChar的内容赋值给p呀,并能正确返回???
end;
退出pd以后str就已经释放了 再使用P结果就成未知了
给你的P分配内存 然后使用StrCopy
比如:
procedure Test(out s: string);
然后对p进行赋值,但是有一点你需要知道,这么分配的内存一定要记得释放FreeMem(p),否则会造成内存泄漏。
通常情况下,不建议你在函数内分配内存,然后再把内存传出去,而是在调用函数之前分配内存,然后把首地址传进去。
总之就是在什么地方分配的内存,最还就在什么地方管理并且释放。
procedure pd(var outStr: string);
begin
//Todo
end;
2、可以在函数体里面为pchar指针分配内存,但要约定调用者在调用此函数后要释放这个指针指向的内存空间。如:
procedure pd(var p:pchar);
begin
p := GetMem(...);
// Todo
end;调用者代码:
var
tempP: pchar;
begin
pd(tempP);
//todo
FreeMem(tempP);
end;
3、由调用者分配足够的内存空间,内存的释放还是由调用者完成。函数体里面只是在这个内存空间里写数据。
getmem(p,10); CopyMemory(p, @arrChar[0], 10);我想把p的位置 指向开始处,方便我再要再拷贝数据
怎么移动位置??
经过多次赋值后
如果showmessage(p);
结果还是正确了
说明 第二次赋值的时候,不用移动指针谢谢大家指点 问题已经基本上解决了
结帖 给分