1.memcpy函数的使用和模拟实现
2.memmove函数的使用和模拟实现
3.memset函数的使用
4,memcmp函数的使用
memcpy函数的使用和模拟实现
void * memcpy ( void * destination, const void * source, size_t num );
函数功能:将源内存的值从源地址中拷贝到目标内存中,拷贝的字节数为num个,
函数的使用:
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[] = { 11,22,33,44,55,66,77,88 };
memcpy(arr1, arr2, 3 * sizeof(int));
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%d ", arr1[i]);//打印拷贝的前三个数值
}
return 0;
}
运行的结果
memcpy函数的模拟实现
#include<stdio.h>
void*my_memecpy(void*s1,void*s2,size_t num)
{
int* temp = (int*)s1;
while (num)
{
*((char*)s1) = *((char*)s2);
s1 = (char*)s1 + 1;
s2=(char*)s2+1;
num--;
}
return temp;
}
int main()
{
int arr1[20] = { 1,2,3,4,5 };
int arr2[] = { 6,7,8,9,10 };
my_memecpy(arr1, arr2, 5 * sizeof(int));
for (int i = 0; i < 5; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
运行的结果是输出
6 7 8 9 10
值得注意的是,memecpy函数拷贝的关于两块独立的内存空间,那如果想要再同一块空间里面操作这个函数能不能得行
比如:
要将前面的数字拷贝到后面的数字中,让4 5 6数字变为1 2 3,
#include<stdio.h>
#include<string.h>
int main()
{
int arr[6] = { 1,2,3,4,5,6};
memcpy(arr+3, arr , 3 * sizeof(int));
int i = 0;
for (i = 0; i < 6; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
函数运行结果是
上,虽然运行的结果是正确的,但只是仅限于VS操作软件,因为每复制一块空间,后面的空间都会瞬间被更新,再拷贝的时候将会拷贝已经更新的,但是要求的是拷贝旧的,(这里可以画图理解一下)
如果再其他的编译软件,,运行的结果将会变成
1 2 1 2 1 6
如果想要实现刚才的功能,需要函数memmove函数,再C语言中规定,memcpy拷贝的不重叠的内存,memmove函数拷贝的是重叠的函数
void * memmove ( void * destination, const void * source, size_t num );
#include<stdio.h>
#include<string.h>
int main()
{
int arr[6] = { 1,2,3,4,5,6};
memmove(arr+2, arr , 3 * sizeof(int));
int i = 0;
for (i = 0; i < 6; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
函数运行的结果是
memmove函数的模拟实现
函数的实现分为两种情况
第一种:将前面的数据拷贝到后面去
如上图,将1 2 3 4 拷贝到4 5 6 7 上去,如果从1开始拷贝,4就会变成1,到后面将4拷贝到7的时候,就不是4拷贝到7了,而是1拷贝到7了,因为4已经被1代替了,种情况下,就要从后往前开始拷贝,就是4先拷贝到7,3拷贝到6,2拷贝到5,1拷贝到4,这就能很好的避免上面的问题
第二种,将后面的数据拷贝到后面去
如果从后往前拷贝的话,7会代替4,等到4拷贝到1的话,就不是4拷贝到1了,而是7拷贝到有,因为4已经被7代替了,这时需要从前往后拷贝,4先拷贝到1,5到2,6到3,7到4,
具体的代码如下
#include<stdio.h>
void* my_memmove(void* s1, const void* s2, size_t num)
{
void* ret = s1;
if (s1 > s2)
{
while (num--)
{
*((char*)s1 + num) = *((char*)s2 + num);
}
}
else
{
while (num--)
{
*(char*)s1 = *(char*)s2 ;
s1 = (char*)s1 + 1;
s2 = (char*)s2 + 1;
}
}
return s1;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr, arr + 4, 4 * sizeof(int));
size_t sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行得结果
3.memset函数的使用
void * memset ( void * ptr, int value, size_t num );
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
ptr:一块内存的初始位置
value:想要设置成得值
num:多少个字节
函数得使用:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[10] = "abcdef";
memset(arr, 'x', 5);
size_t sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++)
{
printf("%c", arr[i]);
}
return 0;
}
运行得结果
4,memcmp函数的使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
比较两块内存的值
同字符串函数strcmp函数一样,比较的同样是ASCI码值,如果相同的话,返回的是0,大于返回的是1,小于返回的是-1,从前往后两个内存的同一位置相互比较,相等就继续,一不相等就停下
完