内存操作函数

为什么引入内存操作函数:在定义中字符串以NUL(空字节)结尾,所以字符串操作函数遇见‘\0’停止。因此我们引入内存操作函数,来解决“非字符串类型”中遇到NUL(数字0)的情况。

内存操作函数:内存操作函数与字符串操作函数非常类似,只不过内存操作函数能够处理任何类型的字节序列。在内存操作函数的参数中,有一个显示的参数说明了要处理的字节数,所以他遇见NUL不会停下来。

下面介绍两种常用的内存操作函数原型:

void *memcpy(void *dst,void const *src,sizt_t len);

memcpy从src的起始位置复制len个“字节”到dst中,可以复制任何类型的值,但是如果dst和src发生重叠,其结果是未定义的。

memcpy功能的实现:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void * my_memcpy(void *dst, void const * src, int len)
{
                 char *p1=dst ;
                 char *p2 = src ;
                 while (len --)
                {
                                *p1++= *p2++;
                }
                 return dst ;
}
int main()
{
                 int arr1[100] = { 0 };
                 int arr2[100]={23,1,2,3,4,5,6,7,8,9,10,11,12};
                 int len = 0;
                scanf( "%d", &len);
                 int *ret =my_memcpy(arr1, arr2, len*sizeof (arr2[0]));
                printf( "%#p\n",&*ret);
                system( "pause");
                 return 0;
}

void *memmove(void *dst,void const *src,size_t len);

memmove的行为与memcpy差不多,不过memmove考虑了src与dst重叠的情况。

memmove功能的实现:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void * my_memmove(void *dst, void const * src, int len)
{
                assert( dst != NULL);
                assert( src != NULL);
                 char *p1 = dst ;
                 char *p2 = src ;
                 if ((p1 >= p2) && (p2 > p1 + len))
                {
                                 for (int i = len - 1; i >= 0; i--)
                                                p1[i] = p2[i];
                }
                 else
                 for (int i = 0; i < len; i++)
                {
                                p1[i] = p2[i];
                }
                 return dst ;
}
int main()
{
                 int arr1[100] = { 0 };
                 int arr2[100] = { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 23 };
                 int len = 0;
                scanf( "%d", &len);
                 int *ret = my_memmove(arr1, arr2, sizeof (arr2[0])*len);
                printf( "%#p\n",&*ret);
                system( "pause");
               return 0;
}
时间: 2024-08-10 17:20:52

内存操作函数的相关文章

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

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

内存操作函数memmove,memcpy,memset

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

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

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

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

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); {

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)