大家好哇,我又来啦。今天的内容是关于内存的函数。
加油!!!!!!
文章目录
一. memcpy的使用及模拟(内存拷贝)
memcpy的使用
mem即memory----英语中的记忆,这里是内存
memcpy是将原数据(source)拷贝到目标空间(destination)中去。
目标空间必须可修改,足够大
这个函数在遇到\0之前并不会停下来
int arr1[] = { 1,2,3,4,5,6,7,8,9,90 };
int arr2[90] = { 0 };
memcpy(arr2, arr1 + 3, 12);//注意注意,是字节的个数,想复制3个,即3*4=12个字节
memcpy的模拟
注意点:void*的指针不能直接进行运算,必须强制类型转换
void* my_memcpy(void* dest, const void* src, size_t num)
{
int i = num;
for (i = 0; i < num; i++)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
//在for循环里
//1. *(int*)dest = *(int*)src;
//*(int*)dest = *(int*)src;//万一是17个字节,前4个整型之后,最后一个字节怎么办
//在此,我们将所有类型的数据切开,一个一个的字节
//
// 2.(char*)dest++;
// (char*)src++;
//在此不能使用(char*)dest++;(char*)src++;
//强制类型转换是临时的,在++的时候,dest已经不是char*
}
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,90 };
int arr2[90] = { 0 };
my_memcpy(arr2, arr1 + 3, 12);
return 0;
}
注意点:source和destination的空间最好不要重叠,如果source和destination有任何的重叠,复制的结果都是未定义的。(对于重叠的内存,交给memmove来处理)
C语言规定:memcpy只要能实现不重叠的拷贝即可,重叠的拷贝交给memmove。
自己拷贝自己的,放在自己的另一个位置。例如,将arr1的12345放在原来34567的位置上
- 但是是有意外的,你原本的3已经变成1了,那后面
二. memmove的使用及模拟(内存移动)
memmove的使用
- memmove的使用与memcpy非常相似。
- 使用memmove需要包含头文件:#include<stdio.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[90] = { 0 };
memmove(arr1 + 2, arr1, 20);
return 0;
}
memmove的模拟
判断到底该如何拷贝:
- 如果两者没有重叠的部分,那就随便,从前往后,从后往前都行。
- 如果dest<src,则从前向后打印
- else,从后向前即可
void* my_memmove(void* dest, const void* src, size_t num)
{
char* ret = dest;
assert(dest && src);
if (dest < src)
{
while (num--)
{
*((char*)dest) = *((char*)src);
dest = (char*)dest + 1;
src =(char*)src + 1;
}
}
else
{
while (num--)//还没进入循环num就已经--了一次
{
*(((char*)dest) + num) = *(((char*)src) + num);
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[90] = { 0 };
my_memmove(arr1 + 2, arr1, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
三. memset函数的使用(内存设置)
memset是用来设置内存的,将内存中的值 以字节为单位 设置成想要的内容。
汉语翻译:
char arr1[] = "hello song";
memset(arr1 + 6, 'i', 4);
//被设置的起始位置 //想要设置为的值 //该值的字节数
//打印结果是hello iiii
int arr1[] = { 0 };
memset(arr1, 1, 4);
//结果错误
这是整型数组,一个元素的大小是4个字节。memset是以字节为单位来设置,所以是给整型的4个字节一个一个设置。从下图也可以看出,是将1的四个字节的数字均改成1,那就是16进制的0x010101,而不是我们想要的结果,将0改为1.
四.memcmp函数的使用(内存比较)
int arr1[] = { 1,2,3,4,5, };
int arr2[] = { 1,2,3,6,5 };
memcmp(arr1, arr2, 13);
//13字节就是3个整形元素+1个字节
先比较前12个字节,发现它们完全一样,继续比较后面的字节,4<6,所以arr1<arr2.所以返回的值<0。