捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >基础知识 > 正文
12 2021.12

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

点击次数:271 更新时间:2021-12-12 15:01:44  【打印此页

使用结构或结构数组, 一般是不需要主动分配内存的, 譬如:

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;
Tips
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:271 更新时间:2021-12-12 15:01:44  【打印此页
关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修