C语言 内存函数
本文介绍了memcpy函数的使用与模拟实现。memcpy用于将源地址的指定字节数数据复制到目标地址,示例展示了其基本用法。模拟实现通过类型转换逐字节复制数据。当源地址和目标地址存在重叠时,建议使用memmove函数,其模拟实现根据地址关系选择从前向后或从后向前复制。文章还简要提及memset设置内存内容和memcmp比较内存区域的功能。这些内存操作函数都需要注意地址重叠问题,确保数据正确复制。
本文介绍了memcpy函数的使用与模拟实现。memcpy用于将源地址的指定字节数数据复制到目标地址,示例展示了其基本用法。模拟实现通过类型转换逐字节复制数据。当源地址和目标地址存在重叠时,建议使用memmove函数,其模拟实现根据地址关系选择从前向后或从后向前复制。文章还简要提及memset设置内存内容和memcmp比较内存区域的功能。这些内存操作函数都需要注意地址重叠问题,确保数据正确复制。
memcpy使⽤和模拟实现
int main()
{
int a1[20] = { 0 };
int a2[5] = { 0,2,2,2,2 };
memcpy(a1+3, a2+2, 20);
for (int i = 0; i < 5; i++)
{
printf("%d ", a1[i]);
}
return 0;
}
模拟实现
#include<string.h>
void my_memcpy(void* a1, void * a2, size_t num)
{
a1=ret;
while (num--)
//每执行一次num减一次
{
//void指针类型不能直接计算需要转换类型
*(char*)a1 = *(char*)a2;
(char*)a1 = (char*)a1 + 1;
(char*)a2 = (char*)a2+1;
}
return 0;
}
int main()
{
int a1[20] = { 0 };
int a2[5] = { 0,2,2,2,2 };
//memcpy(a1+3, a2+2, 20);
my_memcpy(a1, a2, 20);
for (int i = 0; i < 5; i++)
{
printf("%d ", a1[i]);
}
return 0;
}

空间的重叠会导致源空间复制到目标空间的值被覆盖
出现覆盖空间我们就要用memmove函数
memmove函数


memmove 模拟实现
我们先分析 有三种情况 从前向后 从后往前 空间不重叠 三种
而这三种可以当作两种来处理

void my_memmove(void *a1,void *a2,size_t num)
{
char d = (char*)a1;
//从前向后
if(a1<a2)
while (num--)
{
*(char*)a1 = *(char*)a2;
(char*)a1 = (char*)a1 + 1;
(char*)a2 = (char*)a2 + 1;
}
else
{
*((char*)a1 + num) = *((char*)a2 + num);
}
return d;
}
int main()
{
int a1[20] = { 1 ,1,2,3,4};
memmove(a1+2, a1, 20);
for (int i = 0; i < 5; i++)
{
printf("%d ", a1[i]);
}
return 0;
}
memset函数

把对应的字节数的内容设置想成为的内容

memcmp函数

比较源位置和目标位置向后的n个字节


更多推荐



所有评论(0)