捐助郴維網
感謝您對郴維網的支持,你的支持將是郴維網持續發展的動力!
二維碼
×
當前位置:郴維網 >基礎知識 > 正文
12 2021.12

Delphi 的內存操作函數(3): 給結構體指針分配內存

點擊次數:277 更新時間: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安裝調試,服務器維護,數據恢復,密碼破解,網絡布線,網絡檢修,打印機維修,打印機加碳粉,蘋果電腦安裝系統,蘋果電腦安裝雙系統,監控安裝維護,電腦外包,筆記本電腦維修,餐飲、美容行業軟件安裝 等。。。。。。
點擊次數:277 更新時間:2021-12-12 15:01:44  【打印此頁
關鍵詞推薦:郴州電腦城 郴州電腦維修公司 維修電腦公司 郴州軟件開發 上門電腦維修 上門安裝系統 筆記本電腦維修 郴州打印機維修 打印機加碳粉 電腦安裝雙系統 蘋果電腦雙系統 液晶顯示器維修 聯想筆記本維修 聯想筆記本維修電話 戴爾筆記本維修電話 郴州戴爾筆記本維修 戴爾筆記本郴州維修點 華碩筆記本維修點 郴州華碩筆記本維修 郴州筆記本上網維修
免费A级毛片无码A∨免费软件