常量字符串为何可以赋值给char*类型?

adamwyb 2011-05-11 02:43:56
常量字符串为何可以赋值给一个char*类型?为何编译器不报错?应该赋值给const char*才对吗?程序对const char*进行修改会导致编译错误,但对指向常量字符串的char*进行修改,却不会编译出问题,但运行时候报错。编译器为何在编译的时候不对这个进行检查呢?
...全文
339 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
turing-complete 2011-05-11
  • 打赏
  • 举报
回复
pengzhixi 2011-05-11
  • 打赏
  • 举报
回复
因为C标准并没有规定字符串字面值的类型就是const char*
标准只是说了
In translation phase 7, a byte or code of value zero is appended to each multibyte
character sequence that results from a string literal or literals.65) The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. For character string literals, the array elements have type char。
但是你记住字符串字面量现在就是const char*就是了。
飞天御剑流 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 adamwyb 的回复:]
常量字符串为何可以赋值给一个char*类型?为何编译器不报错?应该赋值给const char*才对吗?程序对const char*进行修改会导致编译错误,但对指向常量字符串的char*进行修改,却不会编译出问题,但运行时候报错。编译器为何在编译的时候不对这个进行检查呢?
[/Quote]

这个问题c与c++是不同的,请参考:

blog.csdn.net/supermegaboy/archive/2009/11/23/4854987.aspx
赵4老师 2011-05-11
  • 打赏
  • 举报
回复
概念错误:
常量字符串不是赋值给一个char*类型;而是char*类型初始化为常量字符串!

不要把字符串初始化和字符串赋值弄混了。

对于char *:
初始化:
char *a="abc";
赋值:
char *a;
a=(char *)malloc(4);
strcpy(a,"abc");
---------------------
对于string:
初始化:
string s=string("abc");//调用构造函数typedef basic_string<char> string; basic_string(const basic_string& rhs);这个解释可能不对,须通过单步跟踪验证
赋值:
string s;
s="abc";//调用重载操作符= basic_string& operator=(const E *s);
yfk 2011-05-11
  • 打赏
  • 举报
回复
一般编译器的规则是针对const来做的。
char* 是非“常量”,因此对char*指向的修改,编译器发现不了

ryfdizuo 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 luciferisnotsatan 的回复:]

把常量赋给非常量,都不会有问题呀
int x;
const int y=0;
x = y;
[/Quote]
const char* str = "Hellp";
char* ptr = str; //。。。
辰岡墨竹 2011-05-11
  • 打赏
  • 举报
回复
嗯,因为这种操作在语法上没有问题,常量赋值给变量,不过这个的确是不好的习惯。
luciferisnotsatan 2011-05-11
  • 打赏
  • 举报
回复
把常量赋给非常量,都不会有问题呀
int x;
const int y=0;
x = y;

64,654

社区成员

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

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