为什么strcat函数在VC下运行会出错?

singlespark 2005-01-08 01:46:01
K&R的《c程序设计语言(第二版)习题解答》P63习题5-3解答:用指针方式实现strcat
void strcat(char* s,char* t)
{
while(*s)
s++;
while(*s++=*t++)
;
}
在VC下运行时会终止,调试的时候发现运行到第一个while循环结束,在运行第二个while时出错,也就是当*s='\0'的时候,再赋值给s就出错,这是什么原因啊?在lcc-win32里是可以运行的,不会出现错误。有哪位高人指点一下,谢谢!
...全文
353 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
metal11516580 2005-01-09
  • 打赏
  • 举报
回复
s1给一个足够大的空间
------------------------------------
心中多少的创伤,不可抵挡的空虚,卑躬屈膝的一生,今天只想冲出那枷锁,就要象狂人,金属者---金属狂人
singlespark 2005-01-09
  • 打赏
  • 举报
回复
to:ihsgnep(石头)
第一个 while 后 s 的那个地址已经不允许写入 那个是地址也许是另一个常量的 地盘了

为什么s不允许写入了?这个我有点难于理解。我总觉得s是变量,它可以指向一个字符串,也可以指向另外一个字符串啊。通常我们将指针初始化:char* s=0;以后还是可以让s指向别的地方啊。在第一个while以后*s=0,这两者有什么区别吗?
lovefly_fanny 2005-01-09
  • 打赏
  • 举报
回复
恩,字符拷贝的时候首先得保证
有足够的空间~
然后就是检查了
ihsgnep 2005-01-09
  • 打赏
  • 举报
回复
你可以char sl[n] 预留 足够空间
ihsgnep 2005-01-09
  • 打赏
  • 举报
回复
引用
好像是空间不够的原因。我的main函数如下:
int main()
{
char* s1="abc";
char* s2="def";
strcat(s1,s2);
cout<<s1<<endl;
return 0;
}
但为什么lcc-win32编译器就可以呢?
第一个 while 后 s 的那个地址已经不允许写入 那个是地址也许是另一个常量的 地盘了
这说明lcc 烂
Kshape 2005-01-09
  • 打赏
  • 举报
回复
你要把s2复制到 s1中
s1当然要给予足够得空间才可以了
所以可能报上面的错
singlespark 2005-01-08
  • 打赏
  • 举报
回复
既然s是变量,为什么第二个while就不能继续叠加了?“abc”的常量性质应该不影响s啊?大家说的意思我懂,但是觉得有点难于明白
viqsoft 2005-01-08
  • 打赏
  • 举报
回复
不出错的编译器不是好编译器
=============================
呵呵 说的好
只有我们中国人能看懂~~~
FallenAngel 2005-01-08
  • 打赏
  • 举报
回复
char* s1="abc";
是使指针指向一个固定地址(临时分配,具体和编译器选项有关),一般是处理成一个常量来着
不是说s1是一个常量,s1还是一个变量,而是说"abc"是一个常量
变量最简单的就是
char s1[] = "abc" ;
不过只是一个只有4个字符的字符数组
melonliu 2005-01-08
  • 打赏
  • 举报
回复
to singlespark(星星之火)

char sl[10]="abc";//[10]保证分配足够的空间
zhangfjj 2005-01-08
  • 打赏
  • 举报
回复
char* s1="abc";
char* s2="def";
strcat(s1,s2);
====
常量,应该不容修改,因为只给s1这个指针分配了内存空间,"abc"在常量区。
想不出错,只有用数组!
singlespark 2005-01-08
  • 打赏
  • 举报
回复
如果char* s1="abc";是处理成常量的,那哪种形式是变量的?
FallenAngel 2005-01-08
  • 打赏
  • 举报
回复
char* s1="abc";
是处理成常量的,自然应该报错,估计lcc会报一个warning吧
Nownow 2005-01-08
  • 打赏
  • 举报
回复
s1 is not writeable, so u should declare s1 like below:

char s1[100] = ="abc";
类库 2005-01-08
  • 打赏
  • 举报
回复
不出错的编译器不是好编译器
==================================================
有趣,不过很赞同,呵呵
junnyfeng 2005-01-08
  • 打赏
  • 举报
回复
第一个参数的容量要足够大
liubingqian 2005-01-08
  • 打赏
  • 举报
回复
VC++这样处理很好,保证了安全性。
lbaby 2005-01-08
  • 打赏
  • 举报
回复
...
不出错的编译器不是好编译器
singlespark 2005-01-08
  • 打赏
  • 举报
回复
好像是空间不够的原因。我的main函数如下:
int main()
{
char* s1="abc";
char* s2="def";
strcat(s1,s2);
cout<<s1<<endl;
return 0;
}
但为什么lcc-win32编译器就可以呢?
stevens2009 2005-01-08
  • 打赏
  • 举报
回复
是不是s空间分配不够?
加载更多回复(3)

69,373

社区成员

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

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