const char* str="abcd" 与 char* str="abcd"有区别吗?

gaomingok 2009-07-01 07:36:35
加精
const char* str="abcd" 与 char* str="abcd"有区别吗?
...全文
11283 166 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
166 条回复
切换为时间正序
请发表友善的回复…
发表回复
laciqs 2010-08-13
  • 打赏
  • 举报
回复
另外,改变字符串字面量在C标准中是未定义行为。
laciqs 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 gaomingok 的回复:]
const char* str="abcd" 与 char* str="abcd"有区别吗?
[/Quote]
有区别。
以下解释平台为:x86/Linux/gcc
字符串字面值被分配在.rodata段,在加载运行时操作系统把Text Segment的页面只读保护起来,防止意外改写。
const char* str="abcd",如果是全局变量,那么str所指向的字符串字面值就不能被修改了,操作系统的内存管理和gcc的语义检查为此提供了双重保护。
而后者在运行时改写会出现段错误,gcc也不会进行语义检查。
gaojian980603 2010-07-21
  • 打赏
  • 举报
回复
有区别
第一个不可更改,是常量,更改会报错
第二个可更改,是变量,但是用的不对会报错
kingkingxy 2010-07-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 blh 的回复:]

引用楼主 gaomingok 的帖子:
const char* str="abcd" 与 char* str="abcd"有区别吗?


区别就是

char p[] = "1234";;

const char* str="abcd"
str = p;
str[2] = '1';非法



char* str="abcd"

str = p;
str[2……
[/Quote]
编译可以通过,不代表正确!

其实不管如何说,这两个定义式都是非常危险的,
why0727 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 87 楼 bsnhk 的回复:]

表面的区别是:
1、语法区别;
2、用所声明的方式来访问字符串时,前者不可修改,后者可修改;

本质上没有区别:用间接访问方式,两者都可以修改,不会提示任何警告或出错。
[/Quote]

I服了YOU,你是真正的牛人!!
liyuxia713 2010-06-26
  • 打赏
  • 举报
回复
mark
chumeng1hao 2010-06-12
  • 打赏
  • 举报
回复
MARK
panny90 2010-04-26
  • 打赏
  • 举报
回复
~~~~(>_<)~~~~ 明白自己几斤几两了,发愤图强!!!!
品茶 2010-04-18
  • 打赏
  • 举报
回复
Mark
kuillldan 2010-03-04
  • 打赏
  • 举报
回复 1
我赞同阿荣,标准允许的不一定就是正确的。所谓的语法没有错误,是相对于标准来说,但标准在某些时候某些问题上不一定完全正确。
char *str = “abcd”;毕竟"abcd"是常量 当程序执行 str[2] = 'B' 时编译器并不会报错,但运行阶段就抛异常了,这也说明了char *str = "abcd";这条语句不严格.严格的做法是const char *str = "abcd";
这样保证了"abcd"不被修改,运行时不出错。
simplelovelx 2010-01-26
  • 打赏
  • 举报
回复
这个区别大了!
一个是常变量,一个是字面值常量!
这个说明 前者是分配了内存空间 可以寻址的
而后者 不能寻址,前者可以通过特殊手段(通过基地址+偏移地址)可以修改其值的 虽然它是const!
火於菟 2010-01-26
  • 打赏
  • 举报
回复
汗,发不起言
cymlife 2010-01-25
  • 打赏
  • 举报
回复
还没注意过呢
lclhurricane 2010-01-25
  • 打赏
  • 举报
回复
两者在VC6下没有区别!但是推荐采用const char *p的写法!
Xuon 2010-01-25
  • 打赏
  • 举报
回复
就是啊,前者是一种良好的编程习惯。防止被修改。
davelv 2010-01-25
  • 打赏
  • 举报
回复
不同人对正确和标准的理解有所偏差。
我的观点是基本上支持baihacker和arong1234,反对blh.
赵4老师 2010-01-25
  • 打赏
  • 举报
回复
VC6调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
liutengdas 2010-01-23
  • 打赏
  • 举报
回复
151
smallbear_2008 2010-01-22
  • 打赏
  • 举报
回复
还真有人学习标准啊!有幸拜读,还是讨论比较好,这里面好像那个讨论还没完啊?那两个星多的大牛!!!
v_table 2009-12-29
  • 打赏
  • 举报
回复
前一个是const *,常指针。。
加载更多回复(146)

65,186

社区成员

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

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