1.memcpy
函数:void *memcpy(void *destination, const void *source, size_t num);
描述:
destination
:指向目标内存区域的指针,表示数据将被复制到的目标位置。
source
:指向源内存区域的指针,表示要复制的数据的来源。
num
:要复制的字节数,即复制的数据大小。
memcpy
函数会将 source
指向的内存区域中的数据复制到 destination
指向的内存区域中,从 source
开始,复制 num
字节的数据。这个函数在遇到 '\0' 的时候并不会停下来。 如果source
和destination
有任何的重叠,复制的结果都是未定义的。
使用用例:
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Hello, World!";
char destination[20];
memcpy(destination, source, 13); // 将字符串复制到目标数组
printf("Destination: %s\n", destination);
return 0;
}
在上面的示例中,memcpy
函数将字符串 "Hello, World!"
复制到目标数组 destination
中。输出结果将显示 "Destination: Hello, World!"
。
模拟实现:
void* my_memcpy(void* dest,const void* src,size_t num) {
void* ret = dest;
while (num--) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
2.memmove
函数:void *memmove(void *destination, const void *source, size_t num);
描述:
destination
:指向目标内存区域的指针,表示数据将被复制到的目标位置。
source
:指向源内存区域的指针,表示要复制的数据的来源。
num
:要复制的字节数,即复制的数据大小。
memmove
函数会将源内存区域中的数据复制到目标内存区域中,即使源和目标内存区域有重叠,也能保证正确复制。这是与 memcpy
函数的主要不同,后者在有重叠的情况下可能会导致未定义行为。
使用用例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
memmove(str, str+1, 4); // 将字符串复制到缓冲区
printf("str: %s\n", buffer);
return 0;
}
在上面的示例中,memmove
函数将字符串 "Hello, World!"
复制到缓冲区 buffer
中。尽管源字符串和目标缓冲区有重叠,但 memmove
函数可以安全地进行复制。输出结果将显示 "str: ello"
。
模拟实现:
void* my_memmove(void* dest, const void* src, size_t num) {
void* ret = dest;
//从高地址拷贝到地地址
if (dest < src) {
while (num--) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else {
//从低地址拷贝到高地址
while (num--) {
*((char*)dest+num) = *((char*)src+num);
}
}
return ret;
}
这里需要注意,在进行拷贝时,拷贝顺序根据源字符串与目标字符串的地址值不同而不同,这是为了处理在两者在有重叠时不出现错误。