博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi 的内存操作函数(3): 给结构体指针分配内存
阅读量:6092 次
发布时间:2019-06-20

本文共 1804 字,大约阅读时间需要 6 分钟。

  hot3.png

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

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;

转载于:https://my.oschina.net/hermer/blog/320948

你可能感兴趣的文章
我的友情链接
查看>>
操作系统内核
查看>>
AU14笔记-2
查看>>
Python urllib的urlretrieve()函数解析
查看>>
(FortiGate)飞塔防火墙BYOD网络安全解决方案
查看>>
Mysql 常用函数的 总结 (转)
查看>>
[李景山php]每天TP5-20170116|thinkphp5-Url.php-1
查看>>
jdk与jre的区别
查看>>
弹出菜单
查看>>
高德地图多marker聚合API
查看>>
IPv4 向 IPv6 过渡安全问题不可小觑
查看>>
Linux运维实战之Apache服务器的高级配置(虚拟主机、status)
查看>>
DHCP overview
查看>>
我的友情链接
查看>>
linux 系统无法启动的基本解决方法
查看>>
阿里云产品
查看>>
ESXi磁盘块大小设立
查看>>
Java 初始化与清理
查看>>
C#计算数组的算术平均数、几何平均数、调和平均数、平方平均数和中位数
查看>>
JQuery Select控件操作汇总
查看>>