为什么这段代码一运行就.exe停止工作??

u013529401 2014-01-21 10:21:14
#include<stdio.h>
void swap(char *x,char *y)
{
char t;
t=*x;*x=*y;*y=t;
}

main()
{
char *s1="abc",*s2="123";
swap(s1,s2);
printf("%s,%s\n",s1,s2);
}
...全文
518 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
贵子潘 2014-01-22
  • 打赏
  • 举报
回复
很简单,因为char *s1="abc",*s2="123";这样写是不真确的写法 "abc"是常量字符串,保存在只读的内存块里。应该养成这样写的习惯: const char* s1="abc"; char s1[] = "abc"; //这样就OK,是用常量字符串"abc"初始化局部变量字符数组s1
大奶兔白糖 2014-01-21
  • 打赏
  • 举报
回复
因为char1和char2都指向了常量区,内存的内容应该不能变的吧?
cf_上善若水 2014-01-21
  • 打赏
  • 举报
回复
和传的值得地址有关
cf_上善若水 2014-01-21
  • 打赏
  • 举报
回复
#include <stdio.h> void swap(char *x,char *y) { char *t; t=x;x=y;y=t; printf("%s,%s\n",s1,s2); } int main(void) { char *s1="abc",*s2="123"; swap(s1,s2); }
零度的折翅 2014-01-21
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/350206749 函数传递大总结。什么时候交换成功,什么时候交换不成功,lz参考下吧
u013529401 2014-01-21
  • 打赏
  • 举报
回复
引用 18 楼 zeuong 的回复:
因为你S1和S2都是指向一个字符串常量,怎么可能调换他们头字母,改成数组就行了
谢谢,,我居然发现这试卷里面的Bug了!
零度的折翅 2014-01-21
  • 打赏
  • 举报
回复
引用 31 楼 u013529401 的回复:
[quote=引用 16 楼 zeuong 的回复:] void swap(char* x, char* y) { char temp; temp = *x; *x = *y; *y = temp; } int main() { char s1[20] = "abc"; char s2[20] = "123"; swap(s1,s2); printf("%s,%s\n",s1,s2); getchar(); return 1; }
对的,但是为什么要改掉成char s1[20] = "abc"; char s2[20] = "123";[/quote] 这样就不会抛出异常了,具体参考10楼的解释。
零度的折翅 2014-01-21
  • 打赏
  • 举报
回复
引用 28 楼 u013529401 的回复:
[quote=引用 27 楼 huoqingna2332 的回复:] [quote=引用 26 楼 YTerrenceLau 的回复:] 楼主的需求,16楼不就是答案么。
要1bc,a23 , 16楼的就是[/quote]你的是对的,但是为什么要把指针改成形式改成数组形式啊?[/quote] 这个是为了告诉你,你开始的代码异常的错误,参考我10楼的解释。
u013529401 2014-01-21
  • 打赏
  • 举报
回复
引用 16 楼 zeuong 的回复:
void swap(char* x, char* y) { char temp; temp = *x; *x = *y; *y = temp; } int main() { char s1[20] = "abc"; char s2[20] = "123"; swap(s1,s2); printf("%s,%s\n",s1,s2); getchar(); return 1; }
对的,但是为什么要改掉成char s1[20] = "abc"; char s2[20] = "123";
zhuobattle 2014-01-21
  • 打赏
  • 举报
回复
引用 27 楼 huoqingna2332 的回复:
[quote=引用 26 楼 YTerrenceLau 的回复:] 楼主的需求,16楼不就是答案么。
要1bc,a23 , 16楼的就是[/quote] 那么就要定义把字符串存在栈或上堆上,不要放在全局静态数据区。
u013529401 2014-01-21
  • 打赏
  • 举报
回复
引用 27 楼 huoqingna2332 的回复:
[quote=引用 26 楼 YTerrenceLau 的回复:] 楼主的需求,16楼不就是答案么。
要1bc,a23 , 16楼的就是[/quote]说错了,以为你是16L了
u013529401 2014-01-21
  • 打赏
  • 举报
回复
引用 27 楼 huoqingna2332 的回复:
[quote=引用 26 楼 YTerrenceLau 的回复:] 楼主的需求,16楼不就是答案么。
要1bc,a23 , 16楼的就是[/quote]你的是对的,但是为什么要把指针改成形式改成数组形式啊?
零度的折翅 2014-01-21
  • 打赏
  • 举报
回复
引用 26 楼 YTerrenceLau 的回复:
楼主的需求,16楼不就是答案么。
要1bc,a23 , 16楼的就是
YTerrenceLau 2014-01-21
  • 打赏
  • 举报
回复
楼主的需求,16楼不就是答案么。
u013529401 2014-01-21
  • 打赏
  • 举报
回复
引用 19 楼 huoqingna2332 的回复:
void swap(char **x,char **y) { char *temp = NULL; temp=*x; *x=*y; *y=temp; } main() { char str1[]="abc"; char str2[]="123"; char *p1=str1; char *p2=str2; printf("%s\n",p1); printf("%s\n",p2); swap(&p1,&p2); printf("%s\n",p1); printf("%s\n",p2); }
谢谢啊,可是怎么才能让他输出1bc,a23啊,这答案就是这个
u013529401 2014-01-21
  • 打赏
  • 举报
回复
引用 20 楼 richyhuang 的回复:
这样
void swap(char *x,char *y)
{
	char *t;
	t=x;x=y;y=t;
}

void test2(void)
{
	char *s1="abc",*s2="123";
	swap(s1,s2);
	printf("%s,%s\n",s1,s2);
}
结果不是1bc,a23啊?
YTerrenceLau 2014-01-21
  • 打赏
  • 举报
回复
,还有交换字符这种需求,服了。匿了,貌似楼上有人给出答案了。
u013529401 2014-01-21
  • 打赏
  • 举报
回复
引用 12 楼 yfl819586803 的回复:

#include<stdio.h>
void swap(char **x,char **y)
{
    char *t;
    t=*x;*x=*y;*y=t;
}
  
main()
{
    char *s1="abc",*s2="123";
    swap(&s1,&s2);
    printf("%s,%s\n",s1,s2);
}
这个虽然可以执行,但是与原题不符啊,这题输出结果答案是1bc,a23,而且他给的代码就是开始那段,是不是哪弄错了? 谢谢各位回答~
richyhuang 2014-01-21
  • 打赏
  • 举报
回复
vc6.0 测试通过,
richyhuang 2014-01-21
  • 打赏
  • 举报
回复
这样
void swap(char *x,char *y)
{
	char *t;
	t=x;x=y;y=t;
}

void test2(void)
{
	char *s1="abc",*s2="123";
	swap(s1,s2);
	printf("%s,%s\n",s1,s2);
}
加载更多回复(23)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧