memcpy内存拷贝函数memcpy和字符串拷贝函数strcpy
来源:互联网 发布:车床编程简单实例有图 编辑:程序博客网 时间:2024/05/28 16:04
memcpy的两种实现(转)
第一种:最常见的:
void* memcpy( void* dest, const void* src, size_t count )
{
if (count<0)
{printf("Invalid count number !./n");
return (void*)0;}
if(src==NULL||dest==NULL)
return (void*)0 ;
if ((unsigned int)dest==(unsigned int)src)
{printf("The source is equal with the destanation!./n");
return dest;}
char* d = (char*)dest;
const char* s = (const char*)src;
while(count--)
*d++ = *s++;
return dest;
}
另一个实现,和上面类似,转贴高质量C++/C编程指南中的,供参考:
void *memcpy(void *pvTo, const void *pvFrom, size_t size) { assert((pvTo != NULL) && (pvFrom != NULL)); // 使用断言 byte *pbTo = (byte *) pvTo; // 防止改变pvTo的地址 byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom的地址 while(size -- > 0 ) *pbTo ++ = *pbFrom ++ ; return pvTo; } |
后记:一般出题目让你实现memcpy,个人理解,其意图至少有以下几点:
1.写任何程序都能反映出你的代码风格.
2.考查你是否注意到,要拷贝的源,即const void* src,应该是用const的,避免有意或无意的修改.
3.考查你,不应该直接对src和dst指针进行类似++或--之类的操作,而应该另外申请对应变量用于此操作.
4.指针的类型转化问题,原始参数应该是void *的,你具体操作的时候,应该是转化为某种具体的类型,此处用char比较适合.
5.注意要判断源src是否和dest重复,如果重复,直接返回或返回错误.
6.应该还有其他考虑,如果以后想到,再补充.
补充:后来又重新看了高质量C++/C编程指南,其中,原作者直接对const char *strSrc和strDest进行++操作
char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL)); // 2分
char *address = strDest; // 2分
while( (*strDest++ = * strSrc++) != ‘/0’ ) // 2分
NULL ;
return address ; // 2分
}
此时我才注意到,自己总结的上面第三点,是错误的,因为const char *strSrc中的const是指字符串内容为const,而不是说strSrc是const的,如果要指定strSrc是const,应该写成 char * const strSrc 。
不过,对此,有人也许又该问了,那此处对strSrc进行++操作,不是破坏了原先strSrc的指向了吗?
如果你真是这么问,那么说明你的概念还不是很清楚(我开始也是和你犯了同样错误),实际上这点在高质量C++/C编程指南,也有提及,因为strSrc是函数的形参,而此处虽然对形参的进行++ 操作,改变其指向,但是并没有改变原始属性为const的字符串,而且此处的形参,在函数调用结束之后,也就释放了,对原始传来的地址,没有任何影响。
- memcpy内存拷贝函数memcpy和字符串拷贝函数strcpy
- C中字符串拷贝函数strcpy和内存拷贝函数memcpy的区别与实现
- C语言中的字符串拷贝函数strcpy和内存拷贝函数memcpy的区别与实现
- memcpy 和 strcpy 拷贝函数区别
- 内存拷贝函数memcpy
- 内存拷贝函数memcpy
- memcpy内存拷贝函数
- 内存拷贝memcpy()和填充函数memset()
- 内存拷贝函数strcpy()、memcpy()、memmove()、memset()的用法
- 字符串拷贝函数 sprintf、strcpy 及 memcpy 的区别
- 实现字符串拷贝strcpy和memcpy,以及字符串比较函数strcmp
- 内存拷贝函数memcpy函数深入剖析
- 内存拷贝函数(memcpy)的深入思考
- 自己实现内存拷贝函数memcpy
- 字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较
- 字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较
- 完成字符串拷贝(sprintf、strcpy 及 memcpy 函数)函数之间的区别
- 浅谈C的一些拷贝函数:strcpy, strncpy, memcpy
- c# 选择文件夹
- spring web mvc配置
- Linux 指令篇:备份压缩--unzip
- 使用Eclipse的快捷键——大全
- javascript中最常用的跳转页面代码
- memcpy内存拷贝函数memcpy和字符串拷贝函数strcpy
- MYSQL DELETE语法
- MYSQL INSERT INTO语句
- Mysql日期和时间函数
- MySQL 5.0 触发器
- MySQL Create Table语句
- 虚拟技术与安全
- MySQL修改密码方法
- PHP和MySQL开发的8个技巧