代码农民 发表于 2017-2-12 14:27:25

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

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

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


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



alltolove 发表于 2017-2-12 14:55:31

给变量malloc一个空间就行了

人造人 发表于 2017-2-12 20:06:16

字符串常量在代码段,代码段是只读的(不能修改)
http://blog.fishc.com/5644.html

mhp0114 发表于 2017-2-12 22:47:25

constchar*s="abcd";
这个比较合适

不能修改存储空间中常量区的内容,只能读取

代码农民 发表于 2017-2-13 08:21:00

mhp0114 发表于 2017-2-12 22:47
constchar*s="abcd";
这个比较合适



恩,其实我也想这个是正确的,但是又感觉第三个比第二个更准确....

代码农民 发表于 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'};

lumber2388779 发表于 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了,纯属个人建议

代码农民 发表于 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;
这样做合不合法呢?
      如图:

代码农民 发表于 2017-2-13 09:12:12

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

恩,确实,其实随便用个指针变量去指向常量都是危险的,但是vc6.0有时候不做查。
页: [1]
查看完整版本: 对于字符串常量的一些疑惑