对于字符串常量的一些疑惑
本帖最后由 代码农民 于 2017-2-12 15:26 编辑在C中,声明一个字符串常量该用哪种形式:
1. char*s="abcd";
2. constchar*s="abcd";
3. constchar*consts="abcd";
为什么如下代码编译时没错,运行时会报错?
给变量malloc一个空间就行了 字符串常量在代码段,代码段是只读的(不能修改)
http://blog.fishc.com/5644.html
constchar*s="abcd";
这个比较合适
不能修改存储空间中常量区的内容,只能读取
mhp0114 发表于 2017-2-12 22:47
constchar*s="abcd";
这个比较合适
恩,其实我也想这个是正确的,但是又感觉第三个比第二个更准确.... 人造人 发表于 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'}; 代码农民 发表于 2017-2-13 08:31
恩...其实我是想问字符串常量的表达方法...你看 char* s = "abcd"; 和char s[] = { 'a','b'.'c','d ...
字符串常量我正常用的是#define更方便使用而且不至于不小心修改到值而跟你一样报错
还有个人建议不要再用VC6.0了最好使用最新版本或者2008之后的版本 因为后边的版本跟6.0一些设置方面相差很多,切换使用需要时间,现在公司企业都很少使用VC6.0了,纯属个人建议 想通了,
其实字符串常量本质上是只读字符数组const s[] = { 'a','b'.'c','d','\0'};只不过只读字符数组有名字(数组名,是个常量),和第3条是等价的。
字符串常量没有名字,而char* s = "abcd";只是用一个字符指针变量去指向一个无名常量数组的首地址。其实这种表达方法我感觉最正确的方式是 char* s = ( char* )"abcd";强转之所以被省略,是因为发生隐式转换,编译器没有做检查。
试想一下,如果有这两个式子:
const int a = 1;
int* p = &a;
这样做合不合法呢?
如图: lumber2388779 发表于 2017-2-13 08:55
字符串常量我正常用的是#define更方便使用而且不至于不小心修改到值而跟你一样报错
还有个人建议不要再 ...
恩,确实,其实随便用个指针变量去指向常量都是危险的,但是vc6.0有时候不做查。
页:
[1]