请教一个驱动中对于字符串指针二次赋值的问题

jw212 2010-09-28 02:01:56
一个很简单的程序:
char * string1= "hello";
//KdPrint(("AnsiString1:%Z\n",string1));//打印hello
printf("AnsiString1:%s\n",string1);//打印hello
string1[0]='H';
string1[1]='E';
string1[2]='L';
string1[3]='L';
string1[4]='O';
//KdPrint(("AnsiString1:%Z\n",string1));//打印HELLO
printf("AnsiString1:%s\n",string1);//打印hello
string1类似于const char*,hello位于常量储存区,一般说来初始化后string指向的值不能再被改变,否则会造成运行时错误(编译可以通过),即string1[0]='H';会出问题!(我用vc6.0验证过了)

但是我在驱动中加入类似的代码
CHAR * string1= "hello";
KdPrint(("AnsiString1:%s\n",string1));//打印hello
string1[0]='H';
string1[1]='E';
string1[2]='L';
string1[3]='L';
string1[4]='O';
KdPrint(("AnsiString1:%s\n",string1));//打印hello

却可以正常打印出来sting1的值?
请教高人有没有见解呢?

以上例子来于 windows驱动开发技术详解 这本书;
...全文
171 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
HellMoxi 2010-10-05
在某些编译器上,有时确实不一样!!
  • 打赏
  • 举报
回复
memoleak 2010-10-01
char * string1= "hello";写法是不对的,隐含了一次类型转换(从const char* 到char*)。这样会导致你的程序不可移植。编译器并不一定总把hello放到const data段。所以在某些编译器和某些平台下运行可能会正确。
  • 打赏
  • 举报
回复
cnzdgs 2010-09-28
程序在被调试状态下与实际运行是有差异的,估计是调试器将常量区改成了可写。
  • 打赏
  • 举报
回复
codesnail 2010-09-28
另:纠正楼主一个说法,没有“字符串指针”,只有“字符指针”。
  • 打赏
  • 举报
回复
codesnail 2010-09-28
应该是与编译器有关。
编译器让常量区可修改也没办法。
  • 打赏
  • 举报
回复
发帖
驱动开发/核心开发

2.1w+

社区成员

硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
帖子事件
创建了帖子
2010-09-28 02:01
社区公告
暂无公告