为了账号安全,请及时绑定邮箱和手机立即绑定

请问一个 memcpy 的问题

请问一个 memcpy 的问题

大话西游666 2019-03-29 22:08:34
#include#include#includemain(){char*src="abc123";char*dest="test";//这样会发生segmentationfault(coredumped)//chardest[10]="test";//success这样成功执行//char*dest=strdup("test");//success这样成功执行memcpy(dest,src,strlen(src)+1);printf("%s\n",dest);}//关于memcpy复制字符串时,memcpy(dest,src,strlen(src)+1),目标字符串dest类型char*xxx,charxxx[]有什么不同,char*会发生segmentationfault(coredumped),而charxxx[]不会,但strdup后的char*就能成功执行。
查看完整描述

2 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

char*x="xyz";的标准写法是constchar*x="xyz";,通常用来表示「字符串字面量」,即编译器会把这个字符串放到常量区,因此向其中写入数据会发生错误。
char[]是一个数组,被置于自动变量区,因此可以改变它的值。
strdup会用malloc申请一段内存,并将参数复制进去,因此这个变量位于堆内存上,也是可写的。
其实在后两句中,会「隐式」地创建一个「字符串字面量」,然后将它复制到一段可写内存上。
                            
查看完整回答
反对 回复 2019-03-29
?
慕村9548890

TA贡献1884条经验 获得超4个赞

char*dest="test";在一些编译器编译后分配的是只读空间是一个原因,另一个很显而易见,但是楼上没有人说,我补充一下。"test"一共分配5个字节的内存。你往里面copy的"abc123"长度是7个,显然越界了嘛,你在什么编译器下面编译都会发生segmentationfault(coredumped)的。
简单的这样写很糟糕memcpy(dest,src,strlen(src)+1);这就是万恶之源,不搞清内存大小后面会带来无尽的痛苦的。
                            
查看完整回答
反对 回复 2019-03-29
  • 2 回答
  • 0 关注
  • 491 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号