【1、问题描述】
模拟实现memcpy,函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
【问题重点】
1、函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置,这个函数在遇到’\0’的时候并不会停下来。
2、在具体的函数实现过程中,思路很简单,类似于字符拷贝就可以完成,但有一个问题就是类型,memcpy函数默认的返回值是void*类型,不能直接使用pdest[i] = psrc[i]来拷贝,在这之前我们要先进行类型的强制转换。
【实现代码】
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void* Memcpy(void* dest, const void* src, size_t num) {
assert(dest != NULL);
assert(src != NULL);
const char* psrc = (const char*)src;
char* pdest = (char*)dest;
for (size_t i = 0; i < num; ++i) {
pdest[i] = psrc[i];
}
return dest;
}
int main() {
int arr1[4] = { 0 };
int arr2[4] = { 1,2,3,4 };
Memcpy(arr1, arr2, 16);//单位是字节,所以不能填4
for (int i = 0; i < 4; ++i) {
printf("%d ", arr1[i]);
}
system("pause");
return 0;
}
【运行结果】
【2、问题描述】
模拟实现memmove
【问题重点】
我们知道memcpy与memmove的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的,在两个内存块重叠的情况下,应该怎样处理这一情况下的拷贝?
在内存没有重叠的时候,我们按照memcpy的方式进行拷贝,而有重叠的时候,我们反过来,从源内存块上的最后一个位置开始依次往前拷贝,即可解决问题,因此我们只需要先判断内存重叠情况,if (pdest<psrc || pdest>psrc + num),若满足就从前往后拷贝,否则从后往前拷贝。
【实现代码】
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void* Memmove(void* dest, const void* src, size_t num) {
assert(dest != NULL);
assert(src != NULL);
const char* psrc = (const char*)src;
char* pdest = (char*)dest;
if (pdest<psrc || pdest>psrc + num) {//判断是否存在内存重叠情况
for (size_t i = 0; i < num; ++i) {
pdest[i] = psrc[i];
}
}
else {
for (size_t i = num; i > 0; --i) {
pdest[i] = psrc[i];
}
}
return dest;
}
int main() {
char str[] = "memmove can be very useful......";
Memmove(str + 20, str + 15, 11);
puts(str);
system("pause");
return 0;
}