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



    使用结构或结构数组, 一般是不需要主动分配内存的, 譬如:
    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;
    
  • 相关阅读:
    TypeScript完全解读(26课时)_2.TypeScript完全解读-基础类型
    Flutter实战视频-移动电商-48.详细页_详情和评论的切换
    Flutter实战视频-移动电商-47.详细页_Flutter_html插件的使用
    TypeScript完全解读(26课时)_1.TypeScript完全解读-开发环境搭建
    [Android] The connection to adb is down, and a severe error has occured
    每日一小练——求质数
    C++语言笔记系列之十八——虚函数(1)
    Android 输入管理服务-输入事件向详细应用的分发
    Android技术归档
    C++编写绚丽的界面
  • 原文地址:https://www.cnblogs.com/del/p/1330677.html
Copyright © 2020-2023  润新知