编译无错,运行出错?

binglingbanglang 2003-08-05 10:11:43
#include<iostream.h>
void chang(char *t,char *tt)
{
for(;*t!='\0';t++,tt++)
{
*tt=*t;
*tt='\0';
}

}
void main()
{
char *s1="kkkkkkkk";
char *s2="ttttttttttt";
cout<<s1<<"=s1\n";
cout<<s2<<"=s2\n";
chang(s1,s2);
cout<<s1<<"=s1\n";
cout<<s2<<"=s2\n";
};
为什么编译时没有出错提示,而运行就非法操作了,我的编译器是VC
...全文
57 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
MaiCle 2003-08-05
  • 打赏
  • 举报
回复
for(;*t!='\0';t++,tt++)
{
*tt=*t;
*tt='\0';
}

--- 这是做什么?好可怕。
fireseed 2003-08-05
  • 打赏
  • 举报
回复
Ps. 不要把tt做为变量名,会引起歧义哦~

:)
fireseed 2003-08-05
  • 打赏
  • 举报
回复
char *s1 = "ttttttttttt";
编译器对这一句的编译结果是这样的:

先把"ttttttttttt"做为字符串资源编译进EXE文件的资源段
程序运行后"ttttttttttt"会做为常量放到进程的私有内存段里,这段内存里的数据是只读,不允许修改的,当修改时,操作系统会为你的程序报错。

但是,你把"ttttttttttt"的地址赋给了s2,而s2只是临时在栈里申请的一个变量。在函数返回时就弹掉了。当你把s1的值传到函数chang里时,s2的值赋给了tt,因而tt的值仍然指向那个不充许被改变的数据"ttttttttttt"。最可怕的事情发生了:*tt=*t;你修改了tt的值!你想让"ttttttttttt"里的第一个t变为s,而这些"t"是做为只读数据存放在内存中的,终于,出错了……

要想这样做,因该这样申请内存:
char s1[]="kkkkkkkk";
char s2[]="ttttttttttt";

虽然"kkkkkkkk"和"ttttttttttt"仍然存在,仍然是最危险的只读内存,但是在程序运行时,s1和s2是在栈中申请的一段内存。"kkkkkkkk"和"ttttttttttt"将被复制到s1和s2中。当然,在程序中在栈里申请的s1和s2当然是有读写权限的,所以你放心大胆的用吧!

69,371

社区成员

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

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