C++笔记--strcpy, strncpy, memcpy(16)

本文详细介绍了C语言中三个常用的内存拷贝函数——strcpy, strncpy, memcpy的工作原理与潜在风险。strcpy函数在拷贝时不检查长度,可能导致越界;strncpy虽然可以指定拷贝长度,但不自动添加字符串结束符;memcpy则根据指定字节数拷贝,需注意源目标空间大小及是否重叠。正确使用这些函数避免内存溢出至关重要。
摘要由CSDN通过智能技术生成

目录

strcpy: 

strncpy:

memcpy:


strcpy: 

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

 char *a = "0123456789", *b = "abcdefghijk";
 char c[5];


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

strncpy:

    strcpy的改进版本,多了一个拷贝长度的参数。需要注意的是长度参数应该为目的空间的大小,并且这个函数不会自己附加字符串结束符'',要自己加。

    看下面的例子:

strncpy(c,b,strlen(b))=abcdefghijkw //拷贝长度不对,还是越界
strncpy(c,a,sizeof(c))=01234fghijkw //拷贝长度正确,但是因为拷贝长度内不包括'',所以输出的时候还是会把原本的空间内容输出,直到遇到一个结束符''。


所以正确的做法应该是: strncpy(c, a, sizeof(c)-1); c[5] = '';

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 // 重叠,结果是混乱

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值