目录
1、memcpy 函数
1.1 memcpy 函数的使用
memcpy
函数是 C/C++ 标准库中提供的一个内存拷贝函数,用于将一段内存区域的数据复制到另一个内存区域,其头文件为#include<string.h>。其函数原型如下:
void *memcpy(void *dest, const void *src, size_t n);
dest
:目标内存区域的起始地址。src
:源内存区域的起始地址。n
:要拷贝的字节数。
函数 memcpy 从 src 的位置开始向后复制 n个字节的数据到 dest 指向的内存位置。且在遇到 '\0' 的时候并不会停下来。同时目标地址和源地址不应该重叠,否则结果将是不确定的。
它常用于在不同的内存区域之间进行数据拷贝,比如数组之间的数据复制、结构体的拷贝等。需要注意 memcpy
函数不会检查目标地址空间是否足够大以容纳要拷贝的数据,因此在使用时需要确保目标内存区域足够大,避免发生内存溢出的情况。在 C++ 中,也可以使用 std::memcpy
函数来完成相同的功能,它与 C 语言提供的 memcpy
函数类似。
1.2 memcpy 函数的模拟实现
void* memcpy(void* dst, const void* src, size_t count)
{
void* ret = dst;
assert(dst);
assert(src);
/*
* copy from lower addresses to higher addresses
*/
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return(ret);
}
2、memmove 函数
memmove
函数是C/C++语言中的标准库函数,用于在内存中移动一定数量的字节。它可以在内存块重叠的情况下安全地移动数据,而不会导致数据损坏或未定义行为。和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的,如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
void *memmove(void *dest, const void *src, size_t n);
dest
:目标内存区域的指针,表示数据将要移动到的位置。src
:源内存区域的指针,表示需要移动的数据的起始位置。n
:要移动的字节数。
函数功能:
memmove
函数用于将源内存区域中的数据复制到目标内存区域中,可以正确处理由于重叠而可能导致问题的情况。它确保在移动数据时,即使源内存区域与目标内存区域有重叠,也能够正确地移动数据,不会出现数据损坏或未定义行为。
函数返回值:
memmove
函数返回一个指向目标内存区域的指针,即 dest
的值。
2.1 memmove 函数的使用
2.2 memmove 函数的模拟实现
void* memmove(void* dst, const void* src, size_t count)
{
void* ret = dst;
if (dst <= src || (char*)dst >= ((char*)src + count))
{
/*
* Non-Overlapping Buffers
* copy from lower addresses to higher addresses
*/
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
else {
/*
* Overlapping Buffers
* copy from higher addresses to lower addresses
*/
dst = (char*)dst + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return(ret);
}
3、memset 函数
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
void *memset(void *ptr, int value, size_t num);
ptr
:指向要填充的内存区域的指针。value
:要设置的值,通常是一个无符号字符或整数。num
:要设置的字节数。
函数功能:memset
函数用于将指定内存区域的内容设置为特定的值。它在内存中填充连续的字节块,将每个字节设置为指定的值。通常用于初始化内存块、清零内存或者设置特定的模式。
例1:将字符数组前六个字节内存设置为字符 ‘x’
例2:使用 memset
函数将整个二维数组的内容都设置为 0
4、memcmp 函数
memcmp
函数是C/C++语言中的标准库函数之一,比较从 ptr1 和 ptr2 指针指向的位置开始,向后的num个字节。
int memcmp(const void *ptr1, const void *ptr2, size_t num);
函数功能:memcmp
函数用于比较两个指定内存区域的内容是否相等。它按字节逐个比较两个内存区域,直到发现不相等的字节或者比较完所有字节为止。
函数返回值:
- 如果两个内存区域的内容相等,则返回0。
- 如果第一个不相等的字节在
ptr1
中的值小于ptr2
中的对应字节,则返回负数。 - 如果第一个不相等的字节在
ptr1
中的值大于ptr2
中的对应字节,则返回正数。