您的位置 首页 报告

浅谈linux c编程中的复制函数

浅谈linux c编程中的拷贝函数-strcpy: 最常用的字符串拷贝函数,但是要注意这个函数不会自己判断源字符串是否比目标空间大,必须要程序员自己检查,否则很容易造成拷贝越界。

在linux c编程中,复制函数能够说是无处不必,结合我最近的一些实践,简略研究一下这几个函数。它们的根本用法就不说了,说说实际使用中简略犯错的当地。

strcpy: 最常用的字符串复制函数,可是要留意这个函数不会自己判别源字符串是否比方针空间大,必需求程序员自己查看,不然很简略形成复制越界,下面是几个比方:

char *a = “0123456789”, *b = “abcdefghijk”;

浅谈linux c编程中的复制函数

char c[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 // 堆叠,结果是紊乱

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/102509.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部