模拟实现memcpy和memmove——题集(二十二)
今天主要分享一下实现模拟实现C库的memcpy和memmove的代码实现和运行示例。
首先我们应该知道C库的memcpy的定义和相关规定如下:
void * memcpy ( void * destination, const void * source, size_t num );
且为了避免溢出,目标和源参数所指向的数组的大小,应该至少是num字节,而且不应该重叠。也就是说,目标和源参数不能相同。
由此模拟实现C库的memcpy的源代码和测试用例。
源代码如下:
#include<iostream>
using namespace std;
//模拟实现memcpy
//void * memcpy ( void * destination, const void * source, size_t num );
void * Memcpy( void * destination, const void * source, size_t size ){
int len=size;
char* dst=(char*)destination;
const char* src=(char *)source;
while(len--){
*dst++=*src++;
}
return destination;
}
int main(){
cout<<"模拟实现memcpy"<<endl<<endl;
char* msg="hello world";
char sim0[]={'r','s','t','u','v'};
cout<<"Memcpy(sim0, msg, 0):"<<Memcpy(sim0, msg, 0)<<endl;//模拟实现memcpy
cout<<"sim0:"<<sim0<<endl<<endl;
char sim1[]={'r','s','t','u','v'};
cout<<"Memcpy(sim1, msg, strlen(msg)+1):"<<Memcpy(sim1, msg, strlen(msg)+1)<<endl;
cout<<"sim1:"<<sim1<<endl<<endl;
char sim2[]={'r','s','t','u','v'};
cout<<"Memcpy(sim2, msg, 8):"<<Memcpy(sim2, msg, 8)<<endl;
cout<<"sim2:"<<sim2<<endl<<endl;
int a=28;
int flag=0;
cout<<"Memcpy(&flag, &a, sizeof(a)):"<<Memcpy(&flag, &a, sizeof(a))<<endl;
cout<<"flag: "<<flag<<endl<<endl;
system("pause");
return 0;
}
运行结果:
首先我们应该知道C库的memcpy的定义和相关规定如下:
void * memmove ( void * destination, const void * source, size_t num );
且为了避免溢出,目标和源参数所指向的数组的大小至少为num字节,复制发生在使用中间缓冲区时,允许目标和源重叠。
模拟实现C库的memmove的源代码和运行示例。
源代码如下:
#include<iostream>
using namespace std;
//模拟实现memmove
//void * memmove ( void * destination, const void * source, size_t num );
void * Memmove ( void * destination, const void * source, size_t size )//
{
if(destination == source) return destination;
int len=size;
char* dst=(char*)destination;
const char* src=(char *)source;
while(len--){
*dst++=*src++;
}
return destination;
}
int main(){
cout<<"模拟实现memmove"<<endl<<endl;
char* msg="hello world";
char sim0[]={'r','s','t','u','v'};
cout<<"Memmove(sim0, msg, 0):"<<Memmove(sim0, msg, 0)<<endl;//模拟实现memcpy
cout<<"sim0:"<<sim0<<endl<<endl;
char sim1[]={'r','s','t','u','v'};
cout<<"Memmove(sim1, msg, strlen(msg)+1):"<<Memmove(sim1, msg, strlen(msg)+1)<<endl;
cout<<"sim1:"<<sim1<<endl<<endl;
char sim2[]={'r','s','t','u','v'};
cout<<"Memmove(sim2, msg, 8):"<<Memmove(sim2, msg, 8)<<endl;
cout<<"sim2:"<<sim2<<endl<<endl;
cout<<"Memmove(msg, msg, 8):"<<Memmove(msg, msg, 8)<<endl;
cout<<"msg:"<<msg<<endl<<endl;
int a=28;
int flag=0;
cout<<"Memmove(&flag, &a, sizeof(a)):"<<Memmove(&flag, &a, sizeof(a))<<endl;
cout<<"flag: "<<flag<<endl<<endl;
system("pause");
return 0;
}
运行结果:
分享如上,如有错误,望斧正!愿大家学得开心,共同进步!