Delphi 的内存操作函数(3): 给结构体指针分配内存
2011-08-11 08:11
549 查看
使用结构或结构数组, 一般是不需要主动分配内存的, 譬如:
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;
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;
相关文章推荐
- Delphi 的内存操作函数(3): 给结构体指针分配内存
- Delphi 的内存操作函数(3): 给结构体指针分配内存
- Delphi 的内存操作函数(3): 给结构体指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存( 给字符指针(PChar、PWideChar、PAnsiChar)分配内存最佳的选择是StrAlloc。分配内存的时候会对字符串进行初始化)
- Delphi 的内存操作函数(2): 给数组指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good
- [Delphi]内存分配和释放 内存操作函数(4): 清空与填充内存
- Delphi 给结构体指针分配内存,用new(p),释放用dispose(p)
- 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针(地址),指向字符串开始的空间。new(n)表示分配n个字节的内存空间。
- 44. 腾讯面试题: 使用函数的参数指针,分配内存空间问题
- C/C++学习之C提高----函数调用模型、指针做函数参数、字符串的基本操作、一级指针内存模型建立
- 类函数指针 分配内存 new()
- Delphi的学习笔记八——内存操作函数
- 关于调用子函数给主函数指针分配内存