鱼C论坛

 找回密码
 立即注册
查看: 1794|回复: 8

对于字符串常量的一些疑惑

[复制链接]
发表于 2017-2-12 14:27:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 代码农民 于 2017-2-12 15:26 编辑

在C中,声明一个字符串常量该用哪种形式:
               
                1.    char  *s  =  "abcd";
                2.    const  char  *s  =  "abcd";
                3.    const  char  *const  s  =  "abcd";


为什么如下代码编译时没错,运行时会报错?



QVJV{E6}21O3UQW92LAWI0L.png
YY})3ZECYEVA3LCM7XM%]AA.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-12 14:55:31 | 显示全部楼层
给变量malloc一个空间就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-12 20:06:16 | 显示全部楼层
字符串常量在代码段,代码段是只读的(不能修改)
http://blog.fishc.com/5644.html
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-2-12 22:47:25 | 显示全部楼层
const  char  *s  =  "abcd";
这个比较合适

不能修改存储空间中常量区的内容,只能读取
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-13 08:21:00 | 显示全部楼层
mhp0114 发表于 2017-2-12 22:47
const  char  *s  =  "abcd";
这个比较合适


恩,其实我也想这个是正确的,但是又感觉第三个比第二个更准确....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-13 08:31:58 | 显示全部楼层
人造人 发表于 2017-2-12 20:06
字符串常量在代码段,代码段是只读的(不能修改)
http://blog.fishc.com/5644.html

恩...其实我是想问字符串常量的表达方法...你看   char* s = "abcd";   和  char s[] = { 'a','b'.'c','d','\0'};这俩个都表达字符串常量吗?还有上面的第3条...
所以我想字符串常量应该是个字符只读数组:const char s[] = { 'a','b'.'c','d','\0'};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-13 08:55:32 | 显示全部楼层
代码农民 发表于 2017-2-13 08:31
恩...其实我是想问字符串常量的表达方法...你看   char* s = "abcd";   和  char s[] = { 'a','b'.'c','d ...

字符串常量我正常用的是#define更方便使用而且不至于不小心修改到值而跟你一样报错
还有个人建议不要再用VC6.0了最好使用最新版本或者2008之后的版本 因为后边的版本跟6.0一些设置方面相差很多,切换使用需要时间,现在公司企业都很少使用VC6.0了,纯属个人建议
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-13 09:09:26 | 显示全部楼层
想通了,
其实字符串常量本质上是只读字符数组const s[] = { 'a','b'.'c','d','\0'};只不过只读字符数组有名字(数组名,是个常量),和第3条是等价的。
字符串常量没有名字,而char* s = "abcd";只是用一个字符指针变量去指向一个无名常量数组的首地址。其实这种表达方法我感觉最正确的方式是 char* s = ( char* )"abcd";强转之所以被省略,是因为发生隐式转换,编译器没有做检查。
试想一下,如果有这两个式子:
   const int a = 1;
            int* p = &a;
这样做合不合法呢?
        如图:
`IY53M8U8%(UMPBZH3A5{PG.png
T4WLH}JAKC92[L@3UENC`NS.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-13 09:12:12 | 显示全部楼层
lumber2388779 发表于 2017-2-13 08:55
字符串常量我正常用的是#define更方便使用而且不至于不小心修改到值而跟你一样报错
还有个人建议不要再 ...

恩,确实,其实随便用个指针变量去指向常量都是危险的,但是vc6.0有时候不做查。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 22:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表