浅谈C的一些拷贝函数:strcpy, strncpy, memcpy
来源:互联网 发布:淘宝怎么修改掌柜名字 编辑:程序博客网 时间:2024/05/16 03:45
在linuxc编程中,拷贝函数可以说是无处不用,结合我最近的一些实践,简单研究一下这几个函数。它们的基本用法就不说了,说说实际使用中容易出错的地方。
strcpy:最常用的字符串拷贝函数,但是要注意这个函数不会自己判断源字符串是否比目标空间大,必须要程序员自己检查,否则很容易造成拷贝越界,下面是几个例子:
char *a ="0123456789", *b = "abcdefghijk";
charc[5];
输出: strcpy(c,a)=0123456789 //数组c只有5个字节的空间,但是经过strcpy后a的剩余字符也拷贝过去了,如果c后面是系统程序空间,那就要出问题了。
strncpy:strcpy的改进版本,多了一个拷贝长度的参数。需要注意的是长度参数应该为目的空间的大小,并且这个函数不会自己附加字符串结束符'/0',要自己加。看下面的例子:
strncpy(c,b,strlen(b))=abcdefghijkw //拷贝长度不对,还是越界
strncpy(c,a,sizeof(c))=01234fghijkw//拷贝长度正确,但是因为拷贝长度内不包括'/0',所以输出的时候还是会把原本的空间内容输出,知道遇到一个结束符'/0'。
所以正确的做法应该是: strncpy(c, a, sizeof(c)-1); c[5] = '/0';
memcpy:最后说一下这个函数,这个函数是个很强大的工具,因为它可以简单的根据字节数拷贝内存空间内容,所以经常被用于结构体的拷贝。需要注意两点:1、memcpy拷贝的时候源空间的长度和目标空间的长度都需要程序员自己考虑,如果按照源空间的长度拷贝,要注意是否会写溢出,如果按照目标空间的长度拷贝,则要考虑是否造成读溢出(把不该拷贝的内容也拷贝过去了),而读溢出在某些系统环境下(比如AIX),可能会造成coredump(当读到不该读的地址);2、源空间和目标空间不能重叠。如下例:
char src1[]= "src1", src2[]="source2, this is a long src";
char dest[]= "destination";
输出:
memcpy(dest, src1,strlen(dest)) = src1 //读越界
memcpy(dest, src2,strlen(src2)) = source2, this is a long srcis is a long src//写越界
memcpy(dest, dest+2,strlen(dest2) = stination // 重叠,结果是混乱
charc[5];
输出: strcpy(c,a)=0123456789 //数组c只有5个字节的空间,但是经过strcpy后a的剩余字符也拷贝过去了,如果c后面是系统程序空间,那就要出问题了。
strncpy:strcpy的改进版本,多了一个拷贝长度的参数。需要注意的是长度参数应该为目的空间的大小,并且这个函数不会自己附加字符串结束符'/0',要自己加。看下面的例子:
strncpy(c,b,strlen(b))=abcdefghijkw //拷贝长度不对,还是越界
strncpy(c,a,sizeof(c))=01234fghijkw//拷贝长度正确,但是因为拷贝长度内不包括'/0',所以输出的时候还是会把原本的空间内容输出,知道遇到一个结束符'/0'。
所以正确的做法应该是: strncpy(c, a, sizeof(c)-1); c[5] = '/0';
memcpy:最后说一下这个函数,这个函数是个很强大的工具,因为它可以简单的根据字节数拷贝内存空间内容,所以经常被用于结构体的拷贝。需要注意两点:1、memcpy拷贝的时候源空间的长度和目标空间的长度都需要程序员自己考虑,如果按照源空间的长度拷贝,要注意是否会写溢出,如果按照目标空间的长度拷贝,则要考虑是否造成读溢出(把不该拷贝的内容也拷贝过去了),而读溢出在某些系统环境下(比如AIX),可能会造成coredump(当读到不该读的地址);2、源空间和目标空间不能重叠。如下例:
char src1[]= "src1", src2[]="source2, this is a long src";
char dest[]= "destination";
输出:
memcpy(dest, src1,strlen(dest)) = src1 //读越界
memcpy(dest, src2,strlen(src2)) = source2, this is a long srcis is a long src//写越界
memcpy(dest, dest+2,strlen(dest2) = stination // 重叠,结果是混乱
转自http://blog.sina.com.cn/s/blog_494345130100ee11.html
- 浅谈C的一些拷贝函数:strcpy, strncpy, memcpy
- C语言里的几个拷贝函数memcpy、memset、strcpy、strncpy
- C语言基础-strdup/strcpy/strncpy/memcpy函数的使用
- 【基础C&C++】内存拷贝strcpy,memcpy,memmove,strncpy源码
- linux c/c++ memset();memcpy(),strcpy(),strncpy()等拷贝函数们
- 【字符串拷贝函数】memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy的区别
- strcpy、memcpy、strncpy函数实现
- C语言字符串相关库函数的实现strcpy、memcpy、strncpy、strcat、strncpy、memset、memcpy、strcpy
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数 .
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
- C库中的strcpy,strncpy,memcpy,memmove,memset函数
- 用crosstool-ng建立Linux交叉编译环境(以S3C2440(armv4t)为例)
- stdcall、cdecl、pascal在什么方面有所不同
- 左值右值
- spring RowMapper回调接口 以及queryFor系列摘要
- Android 2.3 发布
- 浅谈C的一些拷贝函数:strcpy, strncpy, memcpy
- 查找和替换字符串
- 数据结构 编码树问题
- 使用CryptoAPI解析X509证书和P12证书
- J2EE+Flex
- 在U-boot下实现自动识别启动Flash的原理(针对S3C24x0)
- SD Questions on Corporate Structure
- javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
- 一个web.Config或app.Config自定义段configSections的示例