目录
memcpy使用和模拟实现
memcpy() 是C标准库中的一个函数,用于在内存块之间复制一定数量的字节数据。这个函数可以帮助你快速、高效地将数据从一个内存区域复制到另一个内存区域。
memcpy() 函数的原型定义在 <string.h> 头文件中:
void *memcpy(void *dest, const void *src, size_t num);
memcpy() 函数接受三个参数:
1.dest:指向目标内存区域的指针,即数据将被复制到该位置。
2.src:指向源内存区域的指针,即数据将从该位置复制出来。
3.num:要复制的字节数。
使用部分:
memcpy处理非重叠部分,即不自己叠加自己

'\0'照样拷贝过去

模拟部分:
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
while (num--)
{
*((char*)dest) = *((char*)src);
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}

memmove使用和模拟实现
memmove() 和 memcpy() 类似,都是C标准库中用于在内存块之间移动数据的函数。不同之处在于,memmove() 能够处理源内存区域和目标内存区域重叠的情况,而 memcpy() 在这种情况下可能会产生未定义的行为。
memmove() 函数的原型定义也在 <string.h> 头文件中:
void *memmove(void *dest, const void *src, size_t num);
memmove() 函数的参数与 memcpy() 函数类似:
1.dest:指向目标内存区域的指针,即数据将被移动到该位置。
2.src:指向源内存区域的指针,即数据将从该位置移动出来。
3.num:要移动的字节数。
使用部分:
memmove处理重叠部分,即自己叠加自己

模拟部分:
void my_memmove(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
if(dest > src) //从后向前
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
else
{
while (num--)
{
*((char*)dest) = *((char*)src);
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
return ret;
}

memcpy函数与memmove函数比较
两者都是内存拷贝函数,但memcpy处理的是不同空间的内容,即目标空间与源空间不同。
memmove函数处理的是相同空间下的内容。
如果用memcpy函数处理相同空间的内容,容易改写原空间的内容从而使结果发生错乱。
memset函数的使用
memset() 是C标准库中的一个函数,用于将指定内存区域的一块字节数据设置为特定的值。这个函数通常用于初始化内存块,填充内存块或者将内存块清零。
memset() 函数的原型定义在 <string.h> 头文件中:
void *memset(void *s, int c, size_t n);
memset() 函数接受三个参数:
1.s:指向要设置数值的内存区域的指针。
2.c:要设置的值,通常是一个无符号字符。
3.n:要设置的字节数。


memcmp函数的使用
memcmp() 是C标准库中的一个函数,用于比较两个内存区域的内容。该函数会按字节比较两个内存区域的内容,直到发现不同的字节或比较完所有字节为止。
memcmp() 函数的原型定义在 <string.h> 头文件中:
int memcmp(const void *s1, const void *s2, size_t n);
memcmp() 函数接受三个参数:
1.s1:指向第一个内存区域的指针。
2.s2:指向第二个内存区域的指针。
3.n:要比较的字节数。
函数返回值是一个整数,表示比较结果:
1.如果两个内存区域的内容相等,返回0。
2.如果第一个区域小于第二个区域,返回一个负数。
3.如果第一个区域大于第二个区域,返回一个正数。
memcmp函数与strcmp函数类似,但memcmp函数的比较是一个字节一个字节的比较。

当字节大小为17时

可以看到在内存中,当列为4时,arr的07就是一个字节,第17个字节arr1是05, arr2是07

本文详细介绍了C标准库中的memcpy,memmove,memset和memcmp四个内存操作函数的使用方法、原型以及它们之间的区别,包括重叠区域处理和内存初始化/比较功能。
6170

被折叠的 条评论
为什么被折叠?



