linux中strcpy、memcpy的用法与区别
来源:互联网 发布:java动态注入方法 编辑:程序博客网 时间:2024/06/05 06:56
strcpy提供了字符串的复制,以 \0 为结束标志(即一旦遇到数据值为0的内存地址,拷贝过程即结束)。
函数原型如下:
char *strcpy(char *dest, const char *src);
其在内核(lib\string.h)源代码的实现如下:
char *strcpy(char *dest, const char *src){char *tmp = dest;while( (*dest++ = *src++) != '\0' );return tmp;}
即最关键的一点是用到了如下的循环
while ((*dest++ = *src++) != '\0');
这就是为什么用此复制字符串是会出现异常终止的现象。也可以看出strcpy最终是给目的串的末尾赋了结束符'\0'的。
而memcpy是给定来源和目标后,拷贝指定大小n的内存数据,而不管拷贝的内容是什么,根据定义可知不仅限于字符之间的操作。
memcpy的原型为:
void *memcpy(void *dest, const void *src, size_t n);
其在内核源码中(lib/string.h)的实现如下:
void *memcpy(void *dest, const void *src, size_t count) { char *tmp = dest; const char *s = src; while (count--) *tmp++ = *s++; return dest; }
strcpy和memcpy主要有以下3个方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
不难看出,如果你用来复制字符串,memcpy复制的最后并没有给目的字符串dset赋结束符'\0'(由用户的源字符串长度和内容决定)。假如用户源字符串很长,而只需复制一段给目标dest串,因此如果用户要打印复制的结果,那么最后的一步操作就是给dest[count]='\0'。然而这时用户的设置的目的串要足够大,至少比count大1个字符用来存放结束符。如果不晓得这点的话,用户编写的程序也可能打印出来的是很长的字符串或是末尾携带一些乱码了。
1 0
- linux中strcpy、memcpy的用法与区别
- strcpy,memcpy,memset的用法与区别
- linux中memcpy和strcpy的区别
- linux中memcpy和strcpy的区别
- strcpy与memcpy的区别
- Memcpy与strcpy的区别:
- strcpy与memcpy的区别。
- strcpy与memcpy的区别
- strcpy 与 memcpy的区别
- strcpy与memcpy的区别
- strcpy与memcpy的区别
- strcpy与memcpy的区别
- strcpy与memcpy的区别
- strcpy与memcpy的区别
- strcpy 与memcpy的区别
- strcpy与memcpy的区别
- memcpy与strcpy的区别
- strcpy与memcpy的区别
- 数据库sharding和一致性哈希算法
- android 解决输入法键盘遮盖布局问题
- 123
- 你需要知道的Android拍照适配方案
- Mysql彻底卸载
- linux中strcpy、memcpy的用法与区别
- 用友写狗工具 过狗补丁
- 操作系统-五大类别、基本组件以及所提供服务
- 通用模块封装
- 特征选择和特征理解
- Maven设置项目java默认编译版本
- HADOOP大数据离线分析+实时分析框架;Hadoop+Flume+Kafka+Storm+Hive+Sqoop+mysql/oracle
- Majority Element
- ntsysv命令