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

一个程序,总是段错误,希望能帮我看下哪里有问题?

一个程序,总是段错误,希望能帮我看下哪里有问题?

ABOUTYOU 2019-05-13 12:59:34
#include#include#includeintgetmax(inta,intb){if(a>b){returna;}else{returnb;}}voidswap(void*a,void*b){void*tmp;intla=sizeof(a);intlb=sizeof(b);intmax=getmax(la,lb);void*t=(void*)malloc(max);if(t==NULL){printf("%s\n","错误");exit(0);}memcpy(t,a,max);memcpy(a,b,max);memcpy(b,t,max);printf("%d\n",sizeof(a));printf("%d\n",sizeof(b));printf("%d\n",max);free(t);}intmain(){char*str="123";char*str2="456";swap((void*)str,(void*)str2);printf("%s\n",str);printf("%s\n",str2);}
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

char*str="123";
char*str2="456";
这样申请的2个字符串,实际上是2个指针str和str2分别指向了2个字符串常量。
所以当你执行这段代码的时候:
memcpy(a,b,max);
memcpy(b,t,max);
均会报错,因为你试图去修改字符串常量。
另外如果你给出的2个字符串长度不一样,你的程序一样会出错,这个留给你自己思考解决吧
                            
查看完整回答
反对 回复 2019-05-13
?
慕娘9325324

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

如果只想编译通过的话可以做如下修改:
char*str="123";
char*str2="456";
修改成
charstr1[]="123";
charstr2[]="456";
其次memcpy在拷贝时不应该两次都用max,应该一次la一次用lb,你仔细琢磨是不是这个道理.memcpy前是不是要检查各自大小,比如charstr1[3]="12"str2[4]="123",这样交换就存在问题吧?以上回答知识抛砖引玉,肯定还有很多没考虑到的地方。
                            
查看完整回答
反对 回复 2019-05-13
  • 2 回答
  • 0 关注
  • 412 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信