代码如下:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShareMem;
var
P: Pchar;
CSize: Cardinal;
begin
CSize := MAX_COMPUTERNAME_LENGTH + 1;
GetMem(P, CSIze);
GetComputerName(P, CSIze);
ShowMessage(P);
FreeMem(P);
end;执行到ShowMessage的时候提示
Access viloation at Address 20FF49C7 in module "borlnd.mm.dll". Write of Address 00560044uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShareMem;
var
P: Pchar;
CSize: Cardinal;
begin
CSize := MAX_COMPUTERNAME_LENGTH + 1;
GetMem(P, CSIze);
P := '4321';
ShowMessage(P);
FreeMem(P);
end;执行到ShowMessage的时候提示
Invalid Pointer operation
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShareMem;
var
P: Pchar;
CSize: Cardinal;
begin
CSize := MAX_COMPUTERNAME_LENGTH + 1;
GetMem(P, CSIze);
GetComputerName(P, CSIze);
ShowMessage(P);
FreeMem(P);
end;执行到ShowMessage的时候提示
Access viloation at Address 20FF49C7 in module "borlnd.mm.dll". Write of Address 00560044uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShareMem;
var
P: Pchar;
CSize: Cardinal;
begin
CSize := MAX_COMPUTERNAME_LENGTH + 1;
GetMem(P, CSIze);
P := '4321';
ShowMessage(P);
FreeMem(P);
end;执行到ShowMessage的时候提示
Invalid Pointer operation
begin
Result := Str;
end;
Pp: PCHAR;
CSIZE: INTEGER;
begin
CSize := 4;
GetMem(Pp, CSIze);
strpcopy(pp, 'ssss');
ShowMessage(Pp);
freemem(Pp);
end;这样就不会报错
你这样赋值是不正确的 P := '4321';
虽然可以运行,但因为pchar 是一个空结束字符串,与字符产的结构是不同的
P: Pchar;
//CSize: Cardinal;
begin
//CSize := MAX_COMPUTERNAME_LENGTH + 1;
//GetMem(P, CSIze);
P := '4321';
ShowMessage(P);
//FreeMem(P);
end;
P: Pchar; //P 是指针
CSize: Cardinal;
begin
CSize := MAX_COMPUTERNAME_LENGTH + 1;
GetMem(P, CSIze);//在这里你给 P 分配了一块内存。
P := '4321'; //这里你将 P 指向另一处含有常量 '4321' 的内存。此时先前给 P 分配的内存
//已经成了“孤岛”,就是通常所说的“内存泄漏”。
ShowMessage(P);
FreeMem(P); //常量 '4321' 的内存是由系统自动管理的,不允许人工释放。
end;//下面代码正常:
var
P: Pchar; //P 是指针
CSize: Cardinal;
begin
CSize := MAX_COMPUTERNAME_LENGTH + 1;
GetMem(P, CSIze);//在这里你给 P 分配了一块内存。
strcopy(P,'4321'); //将常量 '4321' 复制到先前给 P 分配的内存里。
ShowMessage(P);
FreeMem(P); //释放给 P 分配的内存。
end;
//已经成了“孤岛”,就是通常所说的“内存泄漏”。
觉得这样解释不是很很好,第一个代码在DELPHI2009中会报错,谁能解释一下?
你的两个问题实际都是一个问题,要会举一反三