越写代码越糊涂了...一个简单的指针问题

woodzong 2004-01-22 11:02:19
void main()
{
char *bb = "123456789";
printf("%s", bb);
bb[3] = '1';
printf("%s", bb);
}

代码如上.
其中bb[3]=='1';
运行时内存错了...
代码应该怎么写才能实现修改字符串第四位的操作?
要求不能修改char *bb = "123456789"; 这一行 一定要用char * 定义
越来越傻了...-_____-!!
...全文
44 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zark 2004-01-23
  • 打赏
  • 举报
回复
错误的原因正如楼上所述,bb是指向常量区的,所以不能修改其内容.

但改为这样
char *bb=new char[10];
strcpy(bb,"123456789");
也实在是太麻烦,可简单地改为:

void main()
{
char bb[] = "123456789";
printf("%s", bb);
bb[3] = '1';
printf("%s", bb);
}
Jinhao 2004-01-23
  • 打赏
  • 举报
回复
在C的下面真是错的吗?
chinajiji 2004-01-23
  • 打赏
  • 举报
回复
C正确
C++错误
///////
c/C++都错.
这是月经贴.
char *bb = "123456789";
bb是指向常量字符串的指针,常量字符串在编译时决定,存储在静态存储区.在程序的运行整个过程中不能修改,如果修改bb指向的字符串是绝对错误的,很可能造成运行时错误.
tjcbq 2004-01-23
  • 打赏
  • 举报
回复
我用tc++编译,没有问题.看来应该与编译器有关吧.
celeil 2004-01-23
  • 打赏
  • 举报
回复
用支持最新标准的编译器试试。不过应该不支持。
ahjoe 2004-01-23
  • 打赏
  • 举报
回复
Windows应用程序,这个常量字符串保存在只读存储区中,不能修改。
fierygnu 2004-01-23
  • 打赏
  • 举报
回复
C9x以前的C这样的赙值是合法的,从C9X开始这样的用法成为非法的了
aXu 2004-01-23
  • 打赏
  • 举报
回复
兄弟,你要是学c++的,建议你仔细的把effictive c++好好看看,记住。赫赫。我以前也像你那样写,后来改了。
hifrog 2004-01-23
  • 打赏
  • 举报
回复
看看这个贴:)
http://expert.csdn.net/Expert/topic/2577/2577655.xml?temp=.4602167
hifrog 2004-01-23
  • 打赏
  • 举报
回复
*bb = "123456789";这样声明的字符串在编译时被编译器生成的代码方在只读data segment(数据段),
用char *p是把p指向字符串在数据段的地址,在内存中只有字符串的一个副本,而且只能读,不能修改里面的内容。
而char a[]是把数据段的字符串拷贝到运行时的动态分配栈,在内存中有字符串的两个副本,可以修改字符串在动态分配栈中的内容。

.section .rodata
.LC0:
.string "123456789" //Hello World是放在read only data section(.section .rodata)中

对vc和gcc编译的程序是这种情况,而对于tc不是这种情况
BluntBlade 2004-01-23
  • 打赏
  • 举报
回复
又一次受到同一个错误的洗礼
haoyangmao8 2004-01-23
  • 打赏
  • 举报
回复
woodzong (宗)

这个错误太经典啦
不要急这是C正确C++错误

我想你用的是VC6.0编译器吧
不如换编译器
其实你上面char *bb = "123456789";

就是const char *bb = "123456789";
在这里是等价的
junnyfeng 2004-01-23
  • 打赏
  • 举报
回复
在TC上运行结果正常。

VC上不允许,const char *p="1234"
与 char *p="1234"

编译器处理是一样的,都放到一个被定义为只读的内存空间里,与它是否存在于局部(或全局)静态内存区无关。

可以说是编译器问题.
junglesong 2004-01-23
  • 打赏
  • 举报
回复
指向整数常量的指针:const int * p;它所指向的值只读不能被修改 *p = 4(错误),p = 5(正确)
指向一个整数的常量指针:int * const p;不允许修改指针变量的值,*p = 5 (正确),p = 5 (错误)
junglesong 2004-01-23
  • 打赏
  • 举报
回复
const char *bb = "123456789";
这样是可以的,常指针对应常量字符串.
maojunhua 2004-01-23
  • 打赏
  • 举报
回复
标准c++不行,上面几位都说过,不同编译器不一样,一般常量编译器优化是放在代码段,不能修改的,大体是这个意思,不知对不对哈。
Jinhao 2004-01-22
  • 打赏
  • 举报
回复
C正确
C++错误
byyyyy 2004-01-22
  • 打赏
  • 举报
回复
是不是和编译器有关系呢?应该赋初值啊
byyyyy 2004-01-22
  • 打赏
  • 举报
回复
这是为什么呢?
cqthinker 2004-01-22
  • 打赏
  • 举报
回复
楼主你的程序在tc2.0里很正常啊!
Result:
------------------------------------------
123456789123156789
加载更多回复(1)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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