您的位置:首页 > 编程语言 > Delphi

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

2011-08-11 08:11 549 查看
使用结构或结构数组, 一般是不需要主动分配内存的, 譬如:

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);

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

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

ShowMessageFmt('%d,%d', [p.X, p.Y]);

Dispose(p);

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(p);

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); {指向第二个结构}

p.X := 2; p.Y :=
22;

Inc(p); {指向第三个结构}

p.X := 3; p.Y :=
33;

Inc(p); {指向第四个结构}

p.X := 4; p.Y :=
44;

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

Dec(p, 3);

{读出看看; 注意这里的 wvsprintf 也是格式化函数, 有时它更方便}

wvsprintf(buf, '%d,%d; %d,%d; %d,%d; %d,%d', PChar(p));

ShowMessage(buf); {1,11; 2,22; 3,33; 4,44}

FreeMemory(p);

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(p)[i].X := i;

ArrPoint(p)[i].Y := i * i;

end;

wvsprintf(buf, '%d,%d; %d,%d; %d,%d; %d,%d', PChar(p));

ShowMessage(buf); {0,0; 1,1; 2,4; 3,9}

FreeMemory(p);

end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐