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

  • LiuYang
  • LV5工程师
  • |      2016-02-29 21:36:51
  • 浏览量 2404
  • 回复:0
使用结构或结构数组, 一般是不需要主动分配内存的, 譬如:

var   pts: TPoint; begin   pts.X := 1;

  pts.Y := 2;

  ShowMessageFmt(\'%d,%d\', ); {1,2} end; //结构数组: var   Arr: array<><><><><><><><><><><><><><><><><><><><> of TPoint;

  i: Integer; begin   for i := 0 to Length(Arr) - 1 do   begin     Arr.X := i;

    Arr.Y := Trunc(Sqr(i));

  end;

  ShowMessageFmt(\'%d,%d\', .X, 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\', );

  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\', ); {1,11}   FreeMemory(p); end; //访问给结构指针分配的其他元素: var   p: PPoint;

  buf: array<><><><><><><><><><><><><><><><><><><><> 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<><><><><><><><><><><><><><><><><><><><> of Char; type   ArrPoint = array of TPoint; {用于转换的自定义类型} begin   p := GetMemory(4 * SizeOf(TPoint));



  for i := 0 to 3 do   begin     ArrPoint(p).X := i;

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

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子