文档章节

System.ReallocMem - 重新申请内存

涂孟超
 涂孟超
发布于 2014/09/26 15:33
字数 430
阅读 2
收藏 0
本例是顺着 GetMem 的例子往下做的:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}

Type
  TMyRec = record     {定义结构; 记住该结构的大小是 12 个字节}
    name: string[8];
    age : Word;       {虽然 Word 是 2 字节大小; 但因按 4 字节对齐, 它占用 4 字节}
  end;
  PMyRec = ^TMyRec;   {定义结构指针}

var
  pr: PMyRec;

procedure TForm1.FormCreate(Sender: TObject);
const
  str = '地址: %d; 姓名: %s';
begin
  {申请 3 个 TMyRec 结构大小的内存}
  //GetMem(pr, SizeOf(TMyRec) * 3);
  ReallocMem(pr, SizeOf(TMyRec) * 3); {这一句也可以用上一行代替}

  {赋值}
  pr.name := '张三';
  pr.age := 11;

  Inc(pr);
  pr.name := '李四';
  pr.age := 22;

  Inc(pr);
  pr.name := '王五';
  pr.age := 33;

  {显示三个结构的地址与信息; 地址应该是连续的(相间 12 字节)}
  Dec(pr, 2);
  ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 15278504; 姓名: 张三}
  Inc(pr);
  ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 15278516; 姓名: 李四}
  Inc(pr);
  ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 15278528; 姓名: 王五}

  {重新申请内存, 要 5 个结构大小, 并给 2 个新的结构赋值}
  Dec(pr, 2);
  ReallocMem(pr, SizeOf(TMyRec) * 5);

  Inc(pr, 3);
  pr.name := '马六';
  pr.age := 44;

  Inc(pr);
  pr.name := '孙七';
  pr.age := 55;

  {显示相关信息; 会发现地址虽然还是连续的, 但已经和上面不同!}
  Dec(pr, 4);
  ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 14875920; 姓名: 张三}
  Inc(pr);
  ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 14875932; 姓名: 李四}
  Inc(pr);
  ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 14875944; 姓名: 王五}
  Inc(pr);
  ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 14875956; 姓名: 马六}
  Inc(pr);
  ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 14875968; 姓名: 孙七}

  Dec(pr, 4);
  FreeMem(pr, SizeOf(TMyRec) * 5); {也可以用 FreeMem 清理 ReallocMem 申请的内存}
end;

end.

 
 
 
 
 

 

 

  
System 单元下的公用函数目录

本文转载自:http://www.cnblogs.com/del/archive/2008/03/27/1126180.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
C语言动态内存

malloc 原型: size:请求内存的总字节数 返回值: 总结 申请的内存在申请已后如同数组一样不可变,同时申请的内存是所以可以如数组一样通过访问到,同时用申请的内存空间系统不会进行初始化操作,...

mistylinux
01/17
0
0
PgSQL · 捉虫动态 · 执行大SQL语句提示无效的内存申请大小

背景 我们执行一个大SQL时(长度大于512M),会返回如下错误: 复现 我们首先复现出来这个问题 创建表 插入512M大对象 执行脚本后就能复现出来了 BUG分析 我们先找到出现这个错误的位置。 源...

阿里云RDS-数据库内核组
2015/08/05
0
0
malloc calloc realloc

三个函数的申明分别是: void realloc(void ptr, unsigned newsize); void malloc(unsigned size); void calloc(sizet numElements, sizet sizeOfElement); 都在stdlib.h函数库内 它们的返回值......

余二五
2017/11/22
0
0
C语言解释器的实现--存储结构(一)

目录: 1. 内存池 2. 栈 3. Hash表 1.内存池 在一些小的程序里,没什么必要添加内存管理模块在里面。但是对于比较复杂的代码,如果需要很多的内存操作,那么加入自己的内存管理是有必要的。至...

xumaojun
03/30
0
0
malloc 和alloc及calloc的区别

C语言跟内存分配方式   (1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。   (2) 在栈上创建。在执行函...

never7c
2016/05/16
55
0

没有更多内容

加载失败,请刷新页面

加载更多

layer

Layui Layer在open弹出层中异步加载数据和form表单radio、checkbox、select不渲染,不可点击的解决办法 layer 实现弹窗提交信息 function confirmUpdateAward(i) { layer.open({ ...

mickelfeng
56分钟前
0
0
Spring boot中如何获取profiles环境

  实现ApplicationContextAware @Componentpublic class QiNiuPropertiesConfig implements ApplicationContextAware { /// 获取当前环境public String getActiveProfile() { ret......

writeademo
今天
3
0
机器学习中的End-to-End到底是怎么回事?

简单讲就是,Input--->系统(这里指神经网络)--->Output(直接给出输入,NN神经网络就给出结果,一气喝成!!!) 借用一段对话:(http://dy.163.com/v2/article/detail/C3J6F2NJ0511AQHO....

火力全開
今天
2
0
maven多个模块只编译并且只打包指定的模块

在多module的maven项目中,如果每次打包整个工程显得有些冗余和笨重。 命令:mvn clean package install -pl 模块的名称 -am

lifes77
今天
0
0
eosjs中文手册【2.0】

访问地址:eosjs 2.0 中文手册 - 汇智网

汇智网教程
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部