社区
新手乐园
帖子详情
char* s="abcd"; *s='e'; 为什么报错
CEN0921
2005-12-20 12:30:57
void main()
{
char* s="abcd";
*s='e';
}
这段程序为什么报错呢?字符串能不能这样修改?
...全文
1088
18
打赏
收藏
char* s="abcd"; *s='e'; 为什么报错
void main() { char* s="abcd"; *s='e'; } 这段程序为什么报错呢?字符串能不能这样修改?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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?
如果这都不算爱
2005-12-20
打赏
举报
回复
我在TC3.0下编译不会出错,输出为:ebcd
VC6.0编译也不出错,但是运行出错.
MySQL 数据类型和运算符
============================= # 数据类型 整数类型:五种 TINY SMALL MEDIUM INT BIG 浮点和定点小数类型:三种 FLOAT DOUBLE DECIMAL 日期与时间数据类型:五种 YEAR -1 字符串类型:二种
CHAR
(M) VAR
CHAR
(M) -1 ...
char
*s = “hello” 和
char
s[] = “hello” 的区别
char
*str = “hello”表示在动态变量区开辟一个存放指针的存储单元,指针变量名为str,这个str指向常量区的”hello”,因此不能更改这个字符串的值,比如 str[0]='e’这样不行。
char
str[] = "hello"表示在动态...
C语言中
char
*p=“
abcd
e“的意义
而在p里面存放的其实也就是字符串的首地址,也可以理解为arr数组的首地址。以上就是我的理解了,希望对你有帮助!这串代码打印的会是什么呢?
char
s[] 和
char
*s 的区别
char
s[20] = "hello" 中数组名a也是执行数组第一个字符'h'的指针。现执行下列操作:strcat(d, s)。把字符串加到指针所指的字串上去,出现段错误,本质原因:*d="0123456789"存放在常量区,是...
【学习记录】关于
char
*和
char
[]的一些问题。
已知:
char
*s=“
abcd
e”; 则sizeof(s)、sizeof(*s)、strlen(s)的值依次是多少? 答案应该是:4 1 5 #include <iostream> using namespace std; int main(int argc,
char
** argv) {
char
*s = "
abcd
e"; ...
新手乐园
33,311
社区成员
41,784
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章