目录
1.memcpy函数
1.1memmcpy函数的模拟使用
2.memmove函数
2.1memmove 函数的模拟使用
3.memcmp
3.1memcmp函数的模拟实现
4.memset (内存设置)
4.1memset函数的模拟实现
1.memcpy函数
void* memcpy(void* destination, const void* source, size_t num);//之所以是void*类型是因为接收数据无法确认所以用泛型指针
数memcpy从source的位置开始向后复制num个字节数据到destination的内存位置。
这个函数在遇到'\0'的时候并不会停下来。
如果source和destination有任何重叠,复制的结果都是未定义的。
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7 };
int arr2[20] = { 0 };//我们如果想把arr1拷贝到arr2中,strcpy肯定是行不通的,因为其是字符串拷贝不能拷贝整形
memcpy(arr2, arr1,28);
int i = 0;
for(i=0;i<7;i++)
{
printf("%d\n", arr2[i]);
}
return 0;
}
1.1memmcpy函数的模拟使用
#include<stdio.h>
#include<stdio.h>
char* my_memcpy(void* dest, void* stc, size_t num)
{
void* p = dest;
while (num)
{
*((char*)dest) = *((char*)stc);
((char*)dest)++;
((char*)stc)++;
num--;
}
return p;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7 };
int arr2[20] = { 0 };
my_memcpy(arr2, arr1,28);
int i = 0;
for(i=0;i<7;i++)
{
printf("%d\n", arr2[i]);
}
return 0;
}
如果我们想arr1作为源空间拷贝到目标空间arr1+2中:
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
my_memcpy(arr1 + 2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
我们想要的是1 2 1 2 3 4 5 8 9 10,但运行结果却是:
注意:尽量不要自己拷贝自己(新的编译器会自我优化,但版本较低的编译器不能优化),会出现自己覆盖自己的情况 ,重叠字符串的拷贝要用memmove函数。
2.memmove函数
void * memmove(void* destination,const void* source,size_t num);
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1 + 2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
这和我们想要的结果是完全一样的。
2.1memmove 函数的模拟使用
#include<stdio.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
if (dest < src)
{
//从前往后拷贝
while (num--)
{
(*(char*)dest) = (*(char*)src);
((char*)dest)++;
((char*)src)++;
}
}
else
{
//从后往前拷贝
while (num--)//num先使用后--
{
*((char*)dest + num) = *((char*)src + num);//在这里dest、与src并不需要改变因为num会改变
}
}
return ret;
}
int main()
{
int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1 + 2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
3.memcmp
int memcmp(const void* ptr1,const void* ptr2,size_t num);
比较从ptrt1和ptr2指针开始的num个字节
返回值如下:
这和strcmp的返回值是基本一致的。
#include<stdio.h>
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 1,3,2 };
int ret=memcmp(arr1, arr2, 12);
printf("%d\n", ret);//运行结果为-1
return 0;
}
3.1memcmp函数的模拟实现
#include<stdio.h>
int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{
while(num--)
{
if (*(char*)ptr1 > *(char*)ptr2)
return 1;
else if (*(char*)ptr1 < *(char*)ptr2)
return -1;
else
{
((char*)ptr1)++;
((char*)ptr2)++;
}
}
return 0;
}
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 1,2,3,7,9 };
int ret=my_memcmp(arr1, arr2, 13);
printf("%d\n", ret);//这和库函数memcmp所运行的结果是一致的都是-1
return 0;
}
4.memset (内存设置)
void* memset(void* ptr,int value,size_t mum);
#include<stdio.h>
int main()
{
char arr[] = "hello bit";
memset(arr,'x', 5);
printf("%s\n", arr);
return 0;
}
4.1memset函数的模拟实现
#include<stdio.h>
void* my_memset(void* ptr, int value, size_t num)
{
void* ret = ptr;
while (num--)
{
(*(char*)ptr) = value;
((char*)ptr)++;
}
return ret;
}
int main()
{
char arr[] = "hello bit";
my_memset(arr,'x', 5);
printf("%s\n", arr);
return 0;
}