strcpy vs memcpy vs memmove
来源:互联网 发布:网络黄金egd充值 编辑:程序博客网 时间:2024/06/05 21:58
strcpy和memcpy主要有以下三方面的区别:
- 复制的内容不同,strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等;
- 复制的方法不同,strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出,memcpy则是根据其第3个参数决定复制的长度;
- 用途不同,通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。
strcpy和memcpy都假定输入内存地址不重叠,所以并不安全。而memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。复制后src内容会被更改,但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
代码如下:
char* strcpy(char* des,const char* source) // 假定src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串{ char* r=des; assert((des != NULL) && (source != NULL)); while((*r++ = *source++)!='\0'); return des;}
void *memcpy(void *dest, const void *src, size_t n);
void *memmove( void* dest, const void* src, size_t count ){ char *dp = (char *)dst; char *sp = (char *)src; assert((src!=0)&&(dst!=0)&&(count>0)); // not null if(sp>dp||(sp+count)<dp) // 内存没有重叠或者重叠了不影响正向拷贝 { while(count--) *(dp++) = *(sp++); *dp = '\0'; } else if(sp<dp) // 重叠(此时条件 sp<dp<(sp+count)),如果sp==dp则快速的返回 { // 反向拷贝 sp += count; dp += count; *dp = '\0'; while(count--) *(--dp) = *(--sp); } return dst;}
References
strcpy、memcpy、memmove的区别
阅读全文
0 0
- strcpy vs memcpy vs memmove
- memcpy VS memmove
- memcpy vs strcpy vs strlen
- strcpy vs memcpy
- memcpy函数, strcpy(), memmove().
- memset,strcpy memcpy memmove
- strcpy/memcpy/memmove
- strcpy、memcpy、memmove
- strcpy,memcpy,memmove,memset
- memcpy、strcpy 和memmove
- strcpy,strncpy,memcpy,memmove
- 【VS开发】【C/C++开发】memcpy和memmove的区别
- memset,memcpy,strcpy,memmove,memccpy
- strcpy,memcpy,memmove,memset,strncpy
- strcpy,memcpy,memmove,memset,strncpy
- strcpy,memcpy,memmove,memset,strncpy
- strcpy memcpy memmove的区别
- strcpy/memcpy/memmove的实现
- web.xml配置文件
- win10下完全卸载+重装MySQL教程
- Elasticsearch(二), WebService, 机器人参考资源, Spring
- 手把手教你使用 Raspberry
- 4.2-全栈Java笔记:对象和类的概念及定义
- strcpy vs memcpy vs memmove
- 执行linux中bin目录下的程序
- 博客链接笔记
- Vue.js实现一个todo-list的上移,下移,删除功能
- 动态加载script标签
- 简述死锁
- 栈 实际应用1 如何使用栈来判定括号是否匹配
- ffmpeg 函数简单分析 : av_register_all()
- Oracle执行计划详解