Delphi 的内存操作函数(5): 复制内存

MoveMemory、CopyMemory 的功能类似, 都是复制内存, 都是调用 Move 过程;

MoveMemory、CopyMemory
操作指针; Move 操作实体.

还要注意, 它们的参数位置不一样!

{例1}
var
  buf1,buf2: array[0..9] of AnsiChar;
begin
  buf1 := ‘0123456789‘;
  buf2 := ‘abcdefghij‘;

  Move(buf2[2], buf1[4], 5);

  ShowMessage(buf1); {0123cdefg9}
  ShowMessage(buf2); {abcdefghij}
end;

{例2}
var
  buf1,buf2: array[0..9] of AnsiChar;
begin
  buf1 := ‘0123456789‘;
  buf2 := ‘abcdefghij‘;

  CopyMemory(@buf2[2], @buf1[4], 5);

  ShowMessage(buf1); {0123456789}
  ShowMessage(buf2); {ab45678hij}
end;

{例3}
var
  s1,s2: TStringStream; {两个字符串流}
begin
  s1 := TStringStream.Create;
  s2 := TStringStream.Create;

  {向第一个字符串流写入}
  s1.WriteString(‘万一的 Delphi 博客‘);
  ShowMessage(s1.DataString); {万一的 Delphi 博客}

  {设置第二个字符串流的大小}
  s2.SetSize(6);
  {从第一个流复制到第二个流}
  CopyMemory(s2.Memory, s1.Memory, s2.Size);
  ShowMessage(s2.DataString); {万一的}

  s1.Free;
  s2.Free;
end;

这里仅仅是为了测试, 如果真的使用 TMemoryStream、TStringStream 等流类, 它们自身提供的复制操作更方便.




转自《万一的Delphi博客》

时间: 2024-08-28 15:37:12

Delphi 的内存操作函数(5): 复制内存的相关文章

Delphi中复制带有String的记录结构时不能使用Move之类的内存操作函数

请看下面的代码: program TestRecord; {$APPTYPE CONSOLE} uses  SysUtils,  Math; type  TRecordA = record    Name: string;  end; procedure RunTestRecord;var  R1, R2: TRecordA;begin  R1.Name := StringOfChar('A', RandomRange(64, 256) * 1024);  Move(R1, R2, SizeOf

内存操作函数

为什么引入内存操作函数:在定义中字符串以NUL(空字节)结尾,所以字符串操作函数遇见'\0'停止.因此我们引入内存操作函数,来解决"非字符串类型"中遇到NUL(数字0)的情况. 内存操作函数:内存操作函数与字符串操作函数非常类似,只不过内存操作函数能够处理任何类型的字节序列.在内存操作函数的参数中,有一个显示的参数说明了要处理的字节数,所以他遇见NUL不会停下来. 下面介绍两种常用的内存操作函数原型: void *memcpy(void *dst,void const *src,siz

内存操作函数memmove,memcpy,memset

通过字符串的学习,我们知道字符串操作函数的操作对象是字符串,并且它的结束标志是结束符\0,当然这个说的是不 受限制的字符串函数.然而当我们想要将一段内存的数据复制到另一块内存时,我们不能使用字符串操作函数,当然也 不能一个一个复制,所以就引入了内存操作函数. memcpy函数原型: void *memcpy(void *dst, const void *src, size_t size);将一块内存的数据复制到另一块内存.当两块内存重叠              的时候,memcpy就不能保证拷

PCI设备内存操作函数总结

1.  ExAllocatePool() 函数说明: ExAllocatePool allocates pool memory of the specified type and returns a pointer to the allocated block. 函数定义: PVOID ExAllocatePool( __in  POOL_TYPE PoolType, __in  SIZE_T NumberOfBytes ); 代码中用来分配设备描述DMA adepter设备的特性(DEVICE

Delphi 的内存操作函数(1): 给字符指针分配内存

马上能想到的函数有: GetMem AllocMem ReallocMem FreeMem GetMemory ReallocMemory FreeMemory New Dispose NewStr DisposeStr StrNew StrAlloc StrDispose GlobalAllocPtr GlobalFreePtr WideStrAlloc AnsiStrAlloc StrDispose Move MoveMemory CopyMemory ZeroMemory FillMemo

Delphi 的内存操作函数(1): 给字符指针分配内存( 给字符指针(PChar、PWideChar、PAnsiChar)分配内存最佳的选择是StrAlloc。分配内存的时候会对字符串进行初始化)

马上能想到的函数有: GetMem AllocMem ReallocMem FreeMem GetMemory ReallocMemory FreeMemory New Dispose NewStr DisposeStr StrNew StrAlloc StrDispose GlobalAllocPtr GlobalFreePtr WideStrAlloc AnsiStrAlloc StrDispose Move MoveMemory CopyMemory ZeroMemory FillMemo

Delphi 的内存操作函数(2): 给数组指针分配内存

静态数组, 在声明时就分配好内存了, 譬如: var   arr1: array[0..255] of Char;   arr2: array[0..255] of Integer; begin   ShowMessageFmt('数组大小分别是: %d.%d', [SizeOf(arr1), SizeOf(arr2)]);   {数组大小分别是: 512.1024} end; 对静态数组指针, 虽然在声明之处并没有分配内存, 但这个指针应该分配多少内存是有定数的. 这种情况, 我们应该用 Ne

c语言学习之基础知识点介绍(十九):内存操作函数

一.malloc函数 /* 首先需要导入头文件 #include <stdlib.h> malloc void* malloc(n); n是字节大小 开辟堆空间,开辟的字节数以n为准 返回的是开辟空间的首地址 void*是万能指针,也就是说你可以用任意类型的指针去指向 */ //malloc用法 int *p = malloc(sizeof(int)); *p = 30; printf("%p %d\n",p,*p);//0x100105490 char *pc = mal

c语言中的内存操作函数

int arr[20] =   {0};//再定义并初始化的时候可以这样操作: arr[20] = {0};//不能这样修改数组的值.语法错误. int str[20] = {0}; //将一块内存初始化一个值 memset(arr ,0 ,sizeof(arr))//第一个参数表示初始化地址,第二个参数表示初始化值,第三个参数表示初始化内存大小. memcpy(arr ,str ,sizeof(str))//将str内存空间的内容拷贝到arr指向的内存空间,拷贝的大小为sizeof(str)