char* s="abcd"; *s='e'; 为什么报错

CEN0921 2005-12-20 12:30:57
void main()
{
char* s="abcd";
*s='e';
}
这段程序为什么报错呢?字符串能不能这样修改?
...全文
1088 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xs52121 2005-12-21
  • 打赏
  • 举报
回复
void main()
{
char *s="abcd";
*s='e';
}
s为常指针在赋值肯定不对
可在vc6.0里编译成功,运行不成功
void main()
{
char s[]="abcd";
*s='e';
}
这样就对了,把a换成e,输出就为ebcd了

xkm611217 2005-12-20
  • 打赏
  • 举报
回复
晕 s是指象一个字符串常量 常量能修改吗!!!
megaboy 2005-12-20
  • 打赏
  • 举报
回复 1
这段程序为什么报错呢?字符串能不能这样修改?
--------------------------------------------
从C89开始,对字符串常量的修改就被规定为未定义行为,不过,在C89出现之前,K&R已经说明字符串是一个常量了,同时,在那个K&R时代,已经有不同的编译器允许或者不允许对字符串常量的修改。在C89的草案中,这种行为一度被禁止,但正式版仍然规定为未定义的行为,由于是未定义行为,编译器如何做都可以,能否修改的关键,得看编译器设计者是如何看待这个问题的,他可以把它做成一个编译器错误或者警告,当然也可以什么都不做。在intel的cpu设计出保护模式之后,基于保护模式编写的编译器增加了一种手段,就是把字符串常量放在段描述符权限被标记为只读的数据段里,从而产生运行期错误。

当然,使用未定义行为来编写程序是一种非常不好的风格,不应该提倡写这样的程序,因为这样的程序对编译器的依赖性很强,基本没有移植性可言。但是,如果你要非写不可,你当然可以利用允许修改字符串常量的编译器写出一个合法的程序,除非编译器不允许你这么做。
sankt 2005-12-20
  • 打赏
  • 举报
回复
能否修改关键是看编译器把 "abcd" 这个字符串放在内存的什么地方。

早期的一些编译器把它放到可读写的内存区,所以可以改变这个字符串。但是自从标准把这样的字符串规定为常量之后,为了防止改变它,现在的编译器一般把常量字符串放到内存中的只读存储区,这样的话,如果在程序中在进行修改的话会导致运行错误。

//=================
正解

void main()
{
char s[]="abcd";
*s='e';
}
这样就可以了

loujing 2005-12-20
  • 打赏
  • 举报
回复
个人觉得whyglinux(山青水秀)说的有道理。
loujing 2005-12-20
  • 打赏
  • 举报
回复
在C++ Builder2006中测试如下代码:
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
char *s = "abcd";
*s = 'e';
cout<<s<<endl;
cin.get();
return 0;
}
运行通过,输出ebcd

在VC6.0+SP6上面运行上述代码:
编译链接通过,运行报错。
snailbreak 2005-12-20
  • 打赏
  • 举报
回复
a,b,c,d,\0是存储在常量区里的,s记录了这一字符窜的首地址,常量区是不可修改的, 受C++内存保护机制的制约
terryjwf 2005-12-20
  • 打赏
  • 举报
回复
意图修改一个常量字符串,当然会报错了,前面已经有人说了,应该这样写:
const char *s = "abcd";或者char s[] = "abcd";这样就不会报错了!
dhongda 2005-12-20
  • 打赏
  • 举报
回复
标准中s是指向常量的指针
whyglinux 2005-12-20
  • 打赏
  • 举报
回复
能否修改关键是看编译器把 "abcd" 这个字符串放在内存的什么地方。

早期的一些编译器把它放到可读写的内存区,所以可以改变这个字符串。但是自从标准把这样的字符串规定为常量之后,为了防止改变它,现在的编译器一般把常量字符串放到内存中的只读存储区,这样的话,如果在程序中在进行修改的话会导致运行错误。
yangyzqo 2005-12-20
  • 打赏
  • 举报
回复
UP一下,学习
redlegend_126_com 2005-12-20
  • 打赏
  • 举报
回复
#include <stdio.h>
void main()
{
char* s="abcd";
*s='e';
printf(s);
}
输出结果为:
eabcd
没有问题呀!我用的Turbo C
如果有问题请联系我!
lzp229 2005-12-20
  • 打赏
  • 举报
回复
编译器处理也不同
su5369 2005-12-20
  • 打赏
  • 举报
回复
void main()
{
char s[]="abcd";
*s='e';
}
这么写

你原来是常数型字串
cunsh 2005-12-20
  • 打赏
  • 举报
回复
实际上你应该写成
const char* s="abcd";
goodsun2 2005-12-20
  • 打赏
  • 举报
回复
是编译器的问题吗?
ma100 2005-12-20
  • 打赏
  • 举报
回复
tc是*.c?
  • 打赏
  • 举报
回复
我在TC3.0下编译不会出错,输出为:ebcd
VC6.0编译也不出错,但是运行出错.

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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