浅谈linuxc编程中的拷贝函数

在linux c编程中,拷贝函数可以说是无处不用,结合我最近的一些实践,简单研究一下这几个函数。它们的基本用法就不说了,说说实际使用中容易出错的地方。

strcpy: 最常用的字符串拷贝函数,但是要注意这个函数不会自己判断源字符串是否比目标空间大,必须要程序员自己检查,否则很容易造成拷贝越界,下面是几个例子:

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

 浅谈linuxc编程中的拷贝函数_设计制作_电源/新能源

char c[5];

输出: strcpy(c,a)=0123456789 //数组c只有5个字节的空间,但是经过strcpy后a的剩余字符也拷贝过去了,如果c后面是系统程序空间,那就要出问题了。

strncpy:strcpy的改进版本,多了一个拷贝长度的参数。需要注意的是长度参数应该为目的空间的大小,并且这个函数不会自己附加字符串结束符‘\0&     rs   quo;,要自己加。看下面的例子:

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拷贝的时候源空间的长度和目标空间的长度都需要程序员自己考虑,如果按照源空间的长度拷贝,要注意是否会写溢出,如果按照目标空间的长度拷贝,则要考虑是否造成读溢出(把不该拷贝的内容也拷贝过去了),而读溢出在某些系统环境下(比如     AI   X),可能会造成coredump(当读到不该读的地址);2、源空间和目标空间不能重叠。如下例:

char src1[] = “src1”, src2[]=“source2, this is a long src”;

char dest[] = “des         TI   na         TI   on”;

输出:

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) = s  TI na  TI on // 重叠,结果是混乱

25
191
0
18

相关资讯

  1. 1、放弃警员工作,在周星驰片中混龙套,看得多了,脸熟了人却不在了2284
  2. 2、周星驰新片定档大年初一!将有11部影片扎堆春节档上映!4068
  3. 3、《民兵葛二蛋》9月播出黄渤引领草根抗日882
  4. 4、剧没烂尾却被吐槽,《山河令》将“割韭菜”玩出新花样!1064
  5. 5、《司藤》为何让人欲罢不能?狂炫酷霸拽女主和她的小娇夫,太香了4983
  6. 6、陈晓生日,陈妍希PO两张照片为其庆生,网友:时间小尾巴好浪漫2178
  7. 7、《延禧攻略》复盘:掘金“爆款”还是寻找价值洼地?730
  8. 8、全球总票房达135亿,李冰冰跻身IMDB影星排名前十!3524
  9. 9、黄宥明演绎宫廷“碟中谍”受热议李玉原是“地产大亨”?4035
  10. 10、《荣耀乒乓》:热血为核、成长为根,用一群人的青春讲一种热爱4674
全部评论(0)
我也有话说
0
收藏
点赞
顶部