tc2.0下可以运行,vc6.0为何不能运行?

worldcup 2004-07-23 05:57:48
char *a="aabbcccdefghi";
a[3]='w';
在tc20下输出:a=aabwcccdefghi
而vc60就内存出错,这是为什么??
再如:
char *a="aaa",*b="bbb";
strcpy(a,b);
在tc20下输出:a=bbb
而vc60也内存出错
究竟tc20和vc60的编译器有啥区别???谢谢!!!
...全文
153 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldcup 2004-07-26
  • 打赏
  • 举报
回复
我明白了,谢谢大家的帮助!!!
binglex 2004-07-23
  • 打赏
  • 举报
回复
char *a="aabbcccdefghi";
这样定义a是一个常指针,所指向的内容是readonly 的。

正解
qingyuan18 2004-07-23
  • 打赏
  • 举报
回复
char *a="aabbcccdefghi";
这样定义a是一个常指针,所指向的内容是readonly 的。
whyglinux 2004-07-23
  • 打赏
  • 举报
回复
char *a="aabbcccdefghi";

这是定义了一个字符指针,并使其指向 "aabbcccdefghi" 这个字符串。需要注意的是这个字符串并不是在栈中,而是在静态存储区中。现在的编译器(如VC等)一般把它作为常量对待,不允许更改它。这就是为什么用 VC 6.0 等编译器时用 a[3]='w'; 这样类似的操作更改它时要出错的原因。

然而,在一些旧式的编译器中,包括 TC 2.0 在内,都是把上述字符串作为非常量对待的,可以改变它。所以修改字符串的操作能够成功,就不会出错了。

如果想在现在使用的编译器中把上述字符串作为非常量处理,可借助于编译器的开关选项。例如,如果是GCC编译器,在编译时可加上 -fwritable-strings 选项,从而使常量字符串也编程是可写的。
geesun 2004-07-23
  • 打赏
  • 举报
回复
*(a+3)='w' 可以吗?我自己弄糊涂了!
lbaby 2004-07-23
  • 打赏
  • 举报
回复
char *a="aaa",*b="bbb";
char *a="aabbcccdefghi";
a[3]='w';
在以上的语句中:

a,b指向的区域的内存都是不可以被改变的,任何改变其内容的操作都是非法的
如:
a[0] = 'a';
strcpy(a,"abc");
*a = *b;
如果你要想得到一个内存区域可以改变的字符串数组,可以这样写:
a[] = "aaa";
b[] ="bbb";
freefalcon 2004-07-23
  • 打赏
  • 举报
回复
char *a="aabbcccdefghi"; // 这样写a指向一个字符串常量,a并没有分配内存
a[3]='w'; // 这样使用在VC里便属于非法内存访问,很多编译器都是如此,或者说语言本身就是这样规定的(我没看过标准,或许有错)

tc下为什么可以呢?跟它的实现有关吧,没怎么用过TC,不熟悉
lbaby 2004-07-23
  • 打赏
  • 举报
回复
区别就在于,vc6能让你的错误立即出错而被发现
而tc2一直不声不响直到出错时你还不知哪里错了
geesun 2004-07-23
  • 打赏
  • 举报
回复
char *a="aaa",*b="bbb";
char *a="aabbcccdefghi";
a[3]='w';
这个问题,a不是一个数组,不能够那样操作,没有[]操作。你可以这样操作:
*(a+3)='w', 




strcpy(a,b);
这个本来就应该有问题的,a 不过是个指针,你没有给他分配空间,而char *a="aaa"不是给a分配空间,只是定义一个指针指向一个常量,所以应该有问题的
应该改为这样:
char a[4];,*b="bbb"
strcpy(a,b);这样在任何编译器下应该没有问题。

这些东西可能是有些编译器不够严格而已,

69,382

社区成员

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

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