主题:再谈指针-----------资深程序员请进
初学者QQ
[专家分:70] 发布于 2009-03-21 16:56:00
char *s="win";
*s='p';
printf(s);
这在TC中是可以的,但在VC中会执行出错,为什么,
如果是TC老,可教科书有这么写的。有资深的程序员,可以解释吗?
还是那里写错了,我可以按照教书上写的。???
如果以前的教材老了,那么现在的写法是什么????
回复列表 (共4个回复)
沙发
星绽紫辉 [专家分:1700] 发布于 2009-03-23 18:51:00
楼主
char *s="win";
*s='p';
printf(s);
这在TC中是可以的,但在VC中会执行出错,为什么,
--------------------------------------------------------------------------
我不是资深程序员,TC我也没用过,如果在TC中可以运行正确,只能说是编译器的不同,char *s="win";如此声明的字符缓冲区存放在进程的常量区,是不允许修改的。但是也不是绝对 的,你也可以通过某些手段修改表面上不能修改的东西。。。但是在VC++中,这是不允许的。
板凳
smallsofts [专家分:0] 发布于 2009-04-14 13:36:00
楼上正解~~ 确实是这样 在程序中 "XXXX" 是常量 所以 *p指向的是 常量空间 不允许被修改的 你可以 在 堆区开辟空间 然后处理就可以更新数据 或者利用数组的方式都可以
3 楼
小令00 [专家分:1040] 发布于 2009-04-22 18:17:00
[quote]char *s="win";
*s='p';
[/quote]
在古代是可以的
后来有了ANSI C
也就是C标准
认为字符串的本质是 const char *
(这里可能还有Bjarne Stroustrup的影响)
因此后来的编译器都把对字符串常量中字符的修改作为非法
但是K&R对此不以为然
一直坚持对字符串常量中字符的修改是一个未定义行为
4 楼
初学者QQ [专家分:70] 发布于 2009-04-25 21:29:00
明白了,谢谢
我来回复