请问delphi定义的链表怎么分配内存,释放内存,给节点变量赋值??? ( 积分: 10 )

  • 主题发起人 主题发起人 mill666
  • 开始时间 开始时间
M

mill666

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义了一个链表结构:
代码:
   PDatPkt = ^TDatPkt;
   TDatPkt = packed record
        len:integer

        data:array[0..256-1] of char

        next:PDatPkt;
   end;

让后在窗体上放置一个按钮,按钮的click事件如下:
procedure TForm1.Button1Click(Sender: TObject);
var
DatPkt:Pdatpkt;
s:ansistring;
begin
DatPkt:=PdatPkt( GlobalAlloc(GPTR, sizeof(PDatPkt)) );
ZeroMemory(datpkt,sizeof(Pdatpkt));
datpkt.data:='hello';
datpkt.next:=nil;
s:= ansistring(datpkt.data);
showmessage(s);
GlobalFree(DWORD(datpkt));
end;

然后运行,单击按钮,能够显示'hello',可是马上就出现内存错误了;我试了各种办法,都是出现内存异常错误;

不知道为什么啊。

请问怎么给链表分配内存、释放内存、清空内存等??

千万别说用TList代替,^_^.
 
DatPkt:=PdatPkt( GlobalAlloc(GPTR, sizeof(PDatPkt)) );
>>
new(DatPkt);

ZeroMemory(datpkt,sizeof(Pdatpkt));
>>
ZeroMemory(datpkt,sizeof(Pdatpkt^));

GlobalFree(DWORD(datpkt));
>>
Dispose(datpkt);
 
改一个字,sizeof(PDatPkt)改为sizeof(TDatPkt)就可以了.
分配的内存应该能放下一个TDatPkt的所有内容,而不是只能放下一个指针.
 
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
p, p2: PDatPkt;
Head: PDatPkt;
tail:PDatPkt;
begin
p := nil;
p2 := nil;
Head := nil;
tail := nil;

New(Head);
Head.len := 1;
Head.data := 'aaaa1';
Head.next := nil;
for i := 2 to 10 do
begin
New(p);
p.len := i;
StrCopy(p.data, PChar('aaaa' + inttostr(i)));
p.next := nil;
if tail = nil then
begin
Head.next := p;
end else
begin
tail.next := p;
end;
tail := p;
end;

p := Head;
while (p.next <> nil) do
begin
ShowMessage(IntToStr(p.len) + p.data);
p := p^.next;
end;

p := Head;
while (p.next <> nil) do
begin
p2 := p;
p := p^.next;
Dispose(p2);
end;

end;
 
To Avalon:

你的最后一段代码:
p := Head;
while (p.next <> nil) do
begin
p2 := p;
p := p^.next;
Dispose(p2);
end;

我感觉好像最后一个节点没有释放;因为最后一个节点的next=nil;
假设只有两个节点:
node1.next=node2
node2.next=nil;

while (p.next <> nil)是否应当是while (p <> nil) ??

其他while循环也是同一个问题,比如遍历的循环里面,也只显示
1aaaa1
....
9aaaa9

其实还有一个10aaaa10没有显示出来。
 
while (p.next <> nil) do
这个地方的确是写错了
应该是while (p <> nil)

我的本意只是建议楼主用new和dispose去处理内存
代码写的仓促 没来及检查 毕竟我是一直用的TList
呵呵
 
procedure TForm1.Button1Click(Sender: TObject);
var
DatPkt:Pdatpkt;
s:ansistring;
begin
DatPkt:=new(TDatPkt);
ZeroMemory(datpkt,sizeof(Tdatpkt));
datpkt^.data:='hello';
datpkt^.next:=nil;
s:= ansistring(datpkt^.data);
showmessage(s);
Free(datpkt);
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
I
回复
0
查看
747
import
I
后退
顶部