| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1113 人关注过本帖, 1 人收藏
标题:在TC和VC++中的不同结果,小弟不明白!
只看楼主 加入收藏
fengtianzhi
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-8-9
结帖率:100%
收藏(1)
 问题点数:0 回复次数:8 
在TC和VC++中的不同结果,小弟不明白!
#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);
}
此程序在TC中可以运行可是到了VC++中编译的时候不会出现错误,运行的时候出现

1551E9DF-3DDE-45CF-939E-0B0E3C69314A.jpg (19.79 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 不明白 
2009-08-13 10:29
soler
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:181
专家分:1077
注 册:2005-7-16
收藏
得分:0 
我也不明白啥意思,有点糊涂了。等高人来指点一下吧。
按照我的理解,你的代码的目的应该是把s1和s2字符串首元素相互交换。


2009-08-13 12:13
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
这是编译器生成代码策略的差别,TC看到char *s1="abc",*s2="123"这样的代码会在‘堆’中分配一块内存并初始化。所以你用指针读写其内容,当然没有问题。

VC看到这样的代码,并不会在‘堆’给你分配空间,他用自己的优化策略把你的初始化值“abd”、“123”作为字符串常量直接保存在代码段内,而代码段默认是

只读的,所以你用指针写其内容时,就会引起‘写异常’错误。

知道了这个道理,你只要把代码改为:


char s1[]="abc",s2[]="123"; 即可,因为这样,就强制编译器将这两个字符串分配在了‘栈’内。而‘栈’空间是可读、可写的。

或者 char * s1,*s2;
     s1 = malloc(32 * sizeof(char));
     s2 = malloc(32 * sizeof(char));
这样自己显示化在‘堆’中分配空间,然后再对其初始化,也可。

[ 本帖最后由 东海一鱼 于 2009-8-13 12:26 编辑 ]

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-08-13 12:19
edsanxi520
Rank: 1
等 级:新手上路
帖 子:86
专家分:2
注 册:2008-4-5
收藏
得分:0 
貌似char *str1 = "123";
这样的声明是放在常量区的 常量不能修改
char str1[] = "123";
把他改成这样就行了;

还有你TC编译出来的是16位的应用程序
VC++6.0的那个是WIN32的控制台程序

例如在DOS下 你可以随便修改内存中的数据
但在WIN32下就不行了
2009-08-13 12:25
soler
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:181
专家分:1077
注 册:2005-7-16
收藏
得分:0 
噢,明白了。。
#include<stdio.h>
void swap(char *x,char *y)
{
char t;
t=*x;
*x=*y;
*y=t;
}
main()
{
    char s1[]="abc",s2[]="123";
                //char *p1=s1,*p2=s2;
    swap(s1,s2);//swap(p1,p2);
    printf("%s,%s\n",s1,s2);
}
其实用数组都明白是怎么回事,但是看到有些书或者资料上面写着char *s1="abc",*s2="123";这种形式,然后加了一句这种形式的是静态存储。

#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);
}
这个代码是用来交换s1和s2两个字符串的。


2009-08-13 12:40
fengtianzhi
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-8-9
收藏
得分:0 
回复 3楼 东海一鱼

谢谢,学到了不少东西恩呵呵
2009-08-13 15:30
ic06123
Rank: 2
等 级:论坛游民
帖 子:39
专家分:57
注 册:2009-9-2
收藏
得分:0 
受教了,各位大虾。。。
2009-09-05 21:41
lhl198989
Rank: 2
等 级:论坛游民
帖 子:16
专家分:67
注 册:2009-9-12
收藏
得分:0 
这是因为TC太老了,它还不支持ANSI C,只支持传统C,而在传统C中是可以对字符串进行修改的,而VC6.0则是支持标准C(即ANSI C)的,在ANSI C中是不允许对字符串常量进行修改的。所以会在对话框里出现“该内存不能为‘written’。”的出错提示。
2009-09-12 18:08
小岩子
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-4-10
收藏
得分:0 
这个程序 tc能用vc不能用为什么??
main()
{
int i,k,j;
clrscr();
for(i=1;i<=9;i++)
  {printf("\n");
   for(j=1;j<=i;j++)
   {
      k=j*i;
       printf("%d*%d=%d\t",j,i,k);
     }
   }
}
2011-04-10 20:43
快速回复:在TC和VC++中的不同结果,小弟不明白!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018277 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved