Delphi 的内存操作函数(3): 给结构体指针分配内存

本文介绍了在Pascal编程中如何处理结构体和结构体指针的内存分配。通过示例展示了如何使用New和GetMem来动态分配内存,以及如何通过指针访问和释放内存。此外,还探讨了在处理结构体数组时转换为数组类型的技巧,以更方便地操作内存。
摘要由CSDN通过智能技术生成

使用结构或结构数组, 一般是不需要主动分配内存的, 譬如:
var
pts: TPoint;
begin
pts.X := 1;
pts.Y := 2;
ShowMessageFmt(’%d,%d’, [pts.X, pts.Y]); {1,2}
end;

//结构数组:
var
Arr: array[0…2] of TPoint;
i: Integer;
begin
for i := 0 to Length(Arr) - 1 do
begin
Arr[i].X := i;
Arr[i].Y := Trunc(Sqr(i));
end;
ShowMessageFmt(’%d,%d’, [Arr[High(Arr)].X, Arr[High(Arr)].Y]); {2,4}
end;

但在很多时候, 一些参数是结构指针; 特别是在接受数据时, 一般需要手动分配内存. 如果只使用一个单结构指针, 用 New 分配内存是最合适的, 譬如:
var
p: PPoint; {这是点结构 TPoint 的指针, 系统早定义好的}
begin
New§;

// p^.X := 1; p^.Y := 2; {或者写成下面这样}
p.X := 1; p.Y := 2;

ShowMessageFmt(’%d,%d’, [p.X, p.Y]);
Dispose§;
end;

更多时候, 我们需要给一个结构指针分配更多容量; GetMem 可以很容易地完成这个任务, 关键是如何访问. 譬如:
var
p: PPoint;
begin
p := GetMemory(4 * SizeOf(TPoint)); {分配能容纳 4 个 TPoint 结构的内存}

{下面的代码访问了第一个结构, 其他 3 个怎么访问呢?}
p.X := 1; p.Y := 11;
ShowMessageFmt(’%d,%d’, [p.X, p.Y]); {1,11}

FreeMemory§;
end;

//访问给结构指针分配的其他元素:
var
p: PPoint;
buf: array[0…255] of Char;
begin
p := GetMemory(4 * SizeOf(TPoint)); {分配能容纳 4 个 TPoint 结构的内存}

p.X := 1; p.Y := 11;

Inc§; {指向第二个结构}
p.X := 2; p.Y := 22;

Inc§; {指向第三个结构}
p.X := 3; p.Y := 33;

Inc§; {指向第四个结构}
p.X := 4; p.Y := 44;

{既然用了 Inc, 那么在释放或使用前, 必须把指针退回到起始点!}
Dec(p, 3);

{读出看看; 注意这里的 wvsprintf 也是格式化函数, 有时它更方便}
wvsprintf(buf, ‘%d,%d; %d,%d; %d,%d; %d,%d’, PChar§);
ShowMessage(buf); {1,11; 2,22; 3,33; 4,44}

FreeMemory§;
end;

如上的操作简直太残忍了, 幸亏数据少; 其实这种情况应该用数组, 这里提供一种更巧妙的办法 - 转换(为数组类型):
var
p: PPoint;
i: Integer;
buf: array[0…255] of Char;
type
ArrPoint = array of TPoint; {用于转换的自定义类型}
begin
p := GetMemory(4 * SizeOf(TPoint));

for i := 0 to 3 do
begin
ArrPoint§[i].X := i;
ArrPoint§[i].Y := i * i;
end;

wvsprintf(buf, ‘%d,%d; %d,%d; %d,%d; %d,%d’, PChar§);
ShowMessage(buf); {0,0; 1,1; 2,4; 3,9}

FreeMemory§;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ok060

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值