自学内容网 自学内容网

C语言的内存函数

1.memcpy使⽤和模拟实现

2. memmove使⽤和模拟实现

3. memset函数的使⽤

4. memcmp函数的使⽤

正文开始

1.memcpy使⽤和模拟实现

这是从c++的网站上面截的图,从这张图里面我们就可以看到,memcpy函数的参数,以及返回类型,首先,memcpy,这个名字就是内存复制的缩写,cpy就是copy拷贝的意思,

这个内存函数的作用就如同他的名字一样,拷贝,他的作用就是将一块内存拷贝到另一块内存上面去,,在上面的图里面,就是把source这块源头内存,拷贝到destination目标内存上面去,在他的最后面我们还发现了一个参数,是size_t无符号整型类型的参数,这个参数限制了他的拷贝范围,单位是字节。

这个内存函数的拷贝,他不会管你在内存里面是什么类型的,整型,浮点型,还是字符类型,他都可以进行拷贝,他和strncpy函数不一样,字符串函数,只能作用于字符串,而对于memcpy函数,你只需要关心,拷贝到哪里,几个字节,就可以了,里面存放的是什么数据,不需要管。

上面的是一个拷贝,就可以使用memcpy函数来实现,

前面的是目的内存,中间的是源头内存,最后面的是字节的大小,要拷贝的内存的大小。

接下来,我们来自己实现一下这个函数,

准备了两个数组,目标是把arr1的数据拷贝到arr2里面去,拷贝的大小我们就设置20个字节,注意arr1整个数组的长度为40个字节,相当于是我们就只打印前五个数,,

上面的图片是函数的实现,函数的实现的时候,我们用指针来接受他传过来的地址,但是这里要使用void* 类型的指针来进行接收,虽然我们这里是int类型的数据,但是下次我们可能拷贝的就不是int类型的了,所以我们用void*类型来进行接受,

1. 然后就是因为这个函数的返回值要求是目标内存的首地址,那我们就在一开始把这个目标内存的首地址给他存起来,最后再把它返回

2. 当这两个指针进来的时候,我们先给他断言,判断这两个指针是不是空指针。

然后把这两个指针都给他强制类型转换成char* 类型的指针,然后再解引用。但是为什么要给他转换成char*类型的指针呢?一个整型四个字节,一个char类型一个字节,我们把它转换成char类型的一个字节,一个字节的进行转换。但是我们为什么不知直接换成整型的来进行呢?因为当我们传过去,要求你打印的字节数不是4的倍数的时候,这时候用整型就会出问题,比如你输入了数字7,那么整型是该打印一个整型还是两个整型。但是其实,转换成char* 类型的原因是以字节为单位精确操作内存的需求。

但是,memcpy函数的缺点就是,他只能拷贝不重叠的数据,但是如果遇到了有重叠的数据,那么这时候,memcpy函数就不行了,可能会出错

这时候就需要用到另一个内存函数memmove

2. memmove使⽤和模拟实现

和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。  如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理

memmove函数他会自动处理这种重叠的情况。

这是memmove函数的声明,他的形式和memcpy函数的形式是一样的,你可以认为他们的作用是一样的,都是用来对函数进行复制拷贝,但是memmove函数更强一点,

在这张图里面,你可以很明显的发现要拷贝的数组,就是原数组的地址加2,这时候就会有部分元素会重叠,那这个时候你用memcpy函数可就不行了,他处理不了这种重叠的数组,那就上memmove函数,他就会自己处理重叠问题,不管你怎么重叠,她都能给你解决了,

接下来我们来进行memmove函数的实现,这个也是比较难的,

你先看这个图,把前面的源头内存拷贝到后面去,这时候能不能从前往后的进行拷贝,当然不行,你先拷贝1,再拷贝2,到了拷贝3的时候,就出问题了,因为3已经被重叠了,这时候你就之只能从后往前的进行拷贝,先拷贝5,再拷贝4,。。。这样的进行拷贝,

这张图就不多说了,他就是从前往后的来进行拷贝的。

那么我们就可以得出结论,那就是如果目标地址小于源地址,就进行正向拷贝;如果目标地址大于源地址,就进行反向拷贝。这样可以正确处理源区域和目标区域重叠的情况,避免数据被覆盖而导致错误结果。

上面是memmove函数的实现,

这个的实现有点小难,在库函数里面的时候直接使用他,使用库函数,他就胡自己进行判断

3. memset函数的使⽤

void * memset ( void * ptr, int value, size_t num ); //这是函数的基本形式

memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。

 #include

int main ()

{

char str[] = "hello world";

memset (str,'x',6);

printf(str);

return 0;

}

上面就是一个memset函数。把数组的前6个字节变成‘x’

4. memcmp函数的使⽤

这是一个内存比较函数,比较的是两个内存的给定长度的字节序列

⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节


原文地址:https://blog.csdn.net/daiwoliyunshang/article/details/143734212

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!