内存操作函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存操作函数相关的知识,希望对你有一定的参考价值。

为什么引入内存操作函数在定义中字符串以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;
}


本文出自 “11132019” 博客,请务必保留此出处http://11142019.blog.51cto.com/11132019/1759856

以上是关于内存操作函数的主要内容,如果未能解决你的问题,请参考以下文章

C 中的共享内存代码片段

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段

使用导致内存泄漏的音频片段

jQuery的DOM操作

VSCode自定义代码片段——声明函数