【题目】
已知memcpy的函数为: void* memcpy(void *dst , const void* src , size_t count)
其中dst是目的指针,src是源指针。不调用c++/c的memcpy库函数,请编写memcpy。
-------百度,网新恒天校园招聘
【解析】
1 按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,
即不能对void指针进行如p++的操作,所以需要转换为具体的类型指针来操作,例如char *
2 memcpy是对内存进行操作,可能遇到内存重叠的情况,同样的问题存在于memmove中, 但是源代码中这两个函数的处理方式不一样:
memcpy中dst和src中的区域不能重叠,否则会出现未知结果。函数没做任何内存的处理,内存是否重叠由程序员自己控制。
memmove里面则判断了内存重叠的情况,当内存重叠时从后往前复制,以确保复制正常处理。
【代码】
#include <iostream>
using namespace std;
//实现memcpy库函数
void* memcpy(void *dst, const void *src, size_t count){
// 容错处理
if(dst == NULL || src == NULL){
return NULL;
}
unsigned char *pdst = (unsigned char *)dst;
const unsigned char *psrc = (const unsigned char *)src;
//判断内存是否重叠
bool flag1 = (pdst >= psrc && pdst < psrc + count);
bool flag2 = (psrc >= pdst && psrc < pdst + count);
if(flag1 || flag2){
cout<<"内存重叠"<<endl;
return NULL;
}
// 拷贝
while(count--){
*pdst = *psrc;
pdst++;
psrc++;
}
return dst;
}
int main(){
char c1[] = "hello world";
memcpy(c1+3, c1, 9);
cout<<"memcpy result:"<<c1<<endl;
char c2[] = "love you";
memcpy(c1,c2,8);
cout<<"memcpy result:"<<c1<<endl;
}
#include <iostream>
#include <string.h>
using namespace std;
//实现memmove库函数
void* memmove(void *dst, const void *src, size_t count){
// 容错处理
if(dst == NULL || src == NULL){
return NULL;
}
unsigned char *pdst = (unsigned char *)dst;
const unsigned char *psrc = (const unsigned char *)src;
//判断内存是否重叠
bool flag1 = (pdst >= psrc && pdst < psrc + count);
bool flag2 = (psrc >= pdst && psrc < pdst + count);
if(flag1 || flag2){
// 倒序拷贝
while(count){
*(pdst+count-1) = *(psrc+count-1);
count--;
}//while
}
else{
// 拷贝
while(count--){
*pdst = *psrc;
pdst++;
psrc++;
}//while
}
return dst;
}
int main(){
// 内存重叠
char c1[] = "hello world";
memmove(c1+3, c1, 8);
cout<<"memmove result:"<<c1<<endl;
// 内存不重叠
char c2[] = "hello world";
char c3[] = "love you";
memmove(c2,c3,8);
cout<<"memmove result:"<<c2<<endl;
}
#include <iostream>
using namespace std;
void* memmove(void* str1,const void* str2,size_t n){
char* pStr1= (char*) str1;
const char* pStr2=(const char*)str2;
// 正序拷贝
if (pStr1 < pStr2) {
for(size_t i=0;i!=n;++i){
*(pStr1++)=*(pStr2++);
}
}
// 倒序拷贝
else{
pStr1+=n-1;
pStr2+=n-1;
for(size_t i=0;i!=n;++i){
*(pStr1--)=*(pStr2--);
}
}
return pStr1;
}
int main(){
char str[] = "hello world";
memmove(str+4,str,7);
cout<<str<<endl;
return 0;
}
分享到:
相关推荐
不调用C库函数实现memmove-memcpy函数功能。
单片机下实现的部分经典C库函数,包括printf,memset等,可以用来学习printf源码实现方法,还包括了memset,memcpy,memcmp,strtok,strlen,sprintf,printf函数的C语言实现方法
5.编程实现memcpy.docx
一个使用memcpy的实现版本,考虑内存重叠以及效率
memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...
本书以流行的面试题讲解为主要内容,介绍了C、C++语言基本概念,包括保留字、字符串、指针和引用、结构体、库函数等各个方面的基础知识,介绍了面向对象编程基本概念,包括如何实现继承、多态和封装等。还介绍了排序...
C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始...库中实现的memcpy函数 struct { char name[40]; int age; } person, person_cop
memcpy函数的实现代码,简述了memcpy函数的实现,自己编写memcpy函数
。虽然因为硬件限制没有达到AMD文档中所说memcpy函数300%的性能提升,但在我机器上实测也有%175-%200的明显性能提升(此数据可能根据机器情况不同)。
memcpy函数c语言实现代码
memcpy: 头文件,函数原型,函数功能,函数返回值,说明
对于参加C/C++程序员校园招聘的学生,一些公司会要求求职者写一些常用的库函数的标准实现,所以这个资料,可用于那些参加校园招聘的学生。 我想应该会很有用的。
memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...
1.10 memcpy函数实现 1.11 memcpy和memmove函数的实现 1.12 strcat函数实现 1.13 使用库函数atoi,将char *→int 1.14 使用库函数itoa,将int→char * 1.15 不使用库函数,将int→char * 1.16 不使用库函数,将char ...
2.14.4 memcpy 2.14.5 memmove 2.14.6 memset 2.14.7 strcat 2.14.8 strncat 2.14.9 strchr 2.14.10 strcmp 2.14.11 strncmp 2.14.12 strcoll 2.14.13 strcpy 2.14.14 strncpy 2.14.15 strcspn 2.14.16...
linux内核源码:memcpy,对比这个就发现了自己的不足,memcpy真能考验程序员的编程技能与逻辑思维
内存拷贝的实现函数。此函数完全可以自己用,如果需要可以自己改进。
2.写出my_memcpy()的实现函数,不使用库函数? 3.析构函数和虚函数的用法 4.C++中的类和C中的struct的区别 5.给出点对象,大小对象和矩形对象的类名称? 6.C++中的空类中含有哪些类成员 7.使用Gdi的过程中应当注意...
在32位机器上,用你觉得最高效的方法实现memcpy函数。void*memcpy(void*dest,void*src,unsignedintsize);大家好好考虑一下这个题很不容写好的因为涉及了太多的知识点。。
常用函数的实现strcpy,memcpy,memmove,strcat,strcmp原型