memcpy
- void* memcpy ( void* destination, const void* source, size_t num );
- 作用:按字节进行拷贝
- 参数说明:
- destination:目标数组
- source:源数组
- num:需要拷贝的字节数
- 返回值:destination
官方说明:复制内存块
将num bytes的值从源指向的位置直接复制到目标指向的内存块。源指针和目标指针指向的对象的基本类型与此函数无关;结果是数据的二进制副本。函数不检查源中是否有任何终止的空字符-它总是精确地复制num字节。为了避免溢出,目标参数和源参数指向的数组大小至少应为num字节,并且不应重叠(对于重叠的内存块,memmove是一种更安全的方法)。
测试程序
char *src = "hello!";
char dst[10];
memcpy(dst, src, strlen(src)+1);
puts(dst);
output:
hello!
模拟实现memcpy
void * mymemcpy(void * destination, const void * source, size_t num){
assert(destination);
assert(source);
void* copdst = destination;
while (num){
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
num--;
}
return copdst;
}
memmove
- void * memmove ( void * destination, const void * source, size_t num );
- 作用:将num个字节的值从一个数组中拷贝到另一个数组中
- 参数说明:
- destination:目标数组
- source:源数组
- num:需要移动的字节数
- 返回值:destination
官方说明:将num bytes的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样进行,允许目标和源重叠。源指针和目标指针指向的对象的基本类型与此函数无关;结果是数据的二进制副本。函数不检查源中是否有任何终止的空字符-它总是精确地复制num字节。为避免溢出,目标参数和源参数所指向的数组大小至少应为num字节。
测试程序
char dst[30] = "destination";
memmove(dst + 3, dst, strlen(dst));
puts(dst);
output:
desdestination
模拟实现memmove
void * mymemmove(void * destination, const void * source, size_t num){
assert(destination);
assert(source);
void *copydst = destination;
if (destination <= source || (char *)destination >= ((char *)source + num)){
while (num){
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
num--;
}
}
else{
destination = (char*)destination + num - 1;
source = (char*)source + num - 1;
while (num){
*(char*)destination = *(char*)source;
destination = (char*)destination - 1;
source = (char*)source - 1;
num--;
}
}
return copydst;
}