文章目录
memcpy函数的介绍及模拟实现
memcpy函数的介绍
memcpy函数是头文件string.h中包含的一个库函数,基本形式如下
void* memcpy(void* dest, const void* src, size_t num);
作用是将src向后num个字节的数据都复制到dest所指向的内存位置
注意
该函数在遇到\0时不会停止
如果src与dest的内存有重叠部分,那么复制的结果是未定义的
使用举例:
#include <stdio.h>
#include <string.h>
//memcpy函数的使用
int main()
{
int arr1[] = { 1,2,3,4,5,6 };
int arr2[20] = { 0 };
memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
打印结果如下:
memcpy函数的模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
//memcpy函数的模拟实现
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;//记录dest初始位置用来作为返回值
while (num--)
{
*(char*)dest = *(char*)src;//将dest与src的类型强制转换为char*,便于对每一个字节进行操作
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6 };
int arr2[20] = { 0 };
my_memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
打印结果如下:
memmove函数的介绍及模拟实现
memmove函数的介绍
memmove函数类似,区别在于memmove处理的源内存块与目标内存块是可以重复的,基本形式如下:
void* memmove(char* dest,const char* src,size_t num);
使用举例:
//memmove函数的使用
#include <stdio.h>
#include <string.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
memmove(arr + 2, arr, 20);
int i = 0;
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
return 0;
}
打印结果如下:
memmove函数的模拟实现
//memmove函数的模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memmove(void* dest,const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
if (dest < src)
{
//dest在src的前面时,从前往后移动
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//dest在src后面时,从后往前移动
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
my_memmove(arr, arr + 2, 20);
int i = 0;
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
return 0;
}
打印结果如下:
memset函数的介绍
基本形式:
void* memset(char* ptr,int value,size_t num);
其作用是将ptr地址往后num个字节的内容设置为value的值
使用举例:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "xxxxxxxxxxx";
memset(arr, '6', 5);//将arr数组的前5个字节的内容修改为字符6
printf("%s\n", arr);
return 0;
}
打印结果如下:
memcmp函数的介绍
基本形式:
int memcmp(const void* str1,const void* str2,size_t num);
作用是从str1和str2指向的位置开始往后比较num个字节的内容
返回数值如下:
使用举例:
//memcmp函数的使用举例
int main()
{
char str1[] = "abcdefg";
char str2[] = "abdc";
if (memcmp(str1, str2,3) > 0)
{
printf("str1 > str2\n");
}
else if (memcmp(str1, str2, 3) < 0)
{
printf("str1 < str2\n");
}
else
{
printf("str1 == str2\n");
}
return 0;
}
打印结果如下: