LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4984|回复: 21

const 限定符 很奇怪的问题(c语言新手),请看例子

[复制链接]
发表于 2006-1-10 23:15:34 | 显示全部楼层 |阅读模式
在c语言里
int main() {
   const char* s1 = "test";
   char *s2 = s1;
   s2 = "It's modified!";
   printf("%s\n",s1);
}
out: It's modified!;

这样也可以吗? 照我的理解岂不是const限定符在c语言里只是摆设一个

在c++里
int main() {
   const char* s1 = "test";
   char* s2 = s1;
   ...
}
这样编译通不过,说不能从const char* 转换到char*
再者
int main() {
   const char* s1 = "test";
   char* s2 = (char*) s1;
   s2 = "It's modified!";
   
   cout << s1 << endl;
   cout << s2 << endl;
}
out:test
      It's modified!
这次强制转换并编译通过,可是s1的值并没有改变!!


小弟还是新手!! 请大家赐教!!!
发表于 2006-1-11 00:00:08 | 显示全部楼层
不知道你的编译器是什么版本。我的gcc是debian gcc 4.0.3 prerelease,似乎正常。
  1. $ cat test.c
  2. #include <stdio.h>
  3. int main()
  4. {
  5.         const char* s1 = "test";
  6.         char* s2 = s1;
  7.         s2 = "It's modified!";
  8.         printf("%s\n%s\n", s1, s2);
  9.         return 0;
  10. }
  11. $ gcc -Wall -o test test.c
  12. mytest.c: In function ‘main’:
  13. mytest.c:6: warning: initialization discards qualifiers from pointer target type
  14. $ ./test
  15. test
  16. It's modified!
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-11 00:31:23 | 显示全部楼层
系统是redhat9

难道你的gcc版本在转换中又重新为定义的新指针分配了内存  晕!! 这是怎么回是!!!
你的情况和我在g++ 中一样  可是在gcc中可以直接修改!!!!
回复 支持 反对

使用道具 举报

发表于 2006-1-11 07:27:33 | 显示全部楼层
Post by aishen944
在c语言里
int main() {
   const char* s1 = "test";
   char *s2 = s1;
   s2 = "It's modified!";
   printf("%s\n",s1);
}
out: It's modified!;

即使可以这样赋值,输出也不可能是s2所指向的字符数组,没有哪个编译器这样弱者吧
楼主再试一下
回复 支持 反对

使用道具 举报

发表于 2006-1-11 08:18:48 | 显示全部楼层
你这里的赋值只是指向新串,原来的串并没有改变。
回复 支持 反对

使用道具 举报

发表于 2006-1-11 09:02:08 | 显示全部楼层
就算原来不是const这样直接等号赋值也不会改变原值的,是否是楼主自己写的编译器?:!!
回复 支持 反对

使用道具 举报

发表于 2006-1-11 09:05:33 | 显示全部楼层
再者,C语言里面的const确实和C++不一样,其实更应该命名为readonly,试试:
  1. const int n = 10;
  2. int array[n];
复制代码
事实上是编译通不过的。因为const其实不是常量,只是说不可使用它而已。再说这只是一个机制,如果你非要强制转换const为非const,C++照样没有办法。如果是gcc编译器的话,可以加上-Wall选项,它会给你一些很有用的警告。
回复 支持 反对

使用道具 举报

发表于 2006-1-11 09:59:17 | 显示全部楼层
Post by pluskid
再者,C语言里面的const确实和C++不一样,其实更应该命名为readonly,试试:

  1. const int n = 10;
  2. int array[n];
复制代码

事实上是编译通不过的。因为const其实不是常量,只是说不可使用它而已。再说这只是一个机制,如果你非要强制转换const为非const,C++照样没有办法。如果是gcc编译器的话,可以加上-Wall选项,它会给你一些很有用的警告。


在 C99 中,只要这样的变量的作用域不是文件,就是可以的。
回复 支持 反对

使用道具 举报

发表于 2006-1-11 10:43:59 | 显示全部楼层
我这里没有楼主所说问题,gcc4.0.2, glibc2.3.6
  1. ~/coding/test $  cat a6.c
  2. #include <stdio.h>
  3. int main()
  4. {
  5.         const char* s1 = "test";
  6.         char *s2 = s1;
  7.         s2 = "It's modified!";
  8.         printf("%s\n",s1);
  9. }
  10. ~/coding/test $  gcc a6.c
  11. a6.c: 在函数 ‘main’ 中:
  12. a6.c:6: 警告:initialization discards qualifiers from pointer target type
  13. ~/coding/test $  ./a.out
  14. test
  15. ~/coding/test $  g++ a6.c
  16. a6.c: In function ‘int main()’:
  17. a6.c:6: 错误:从类型 ‘const char*’ 到类型 ‘char*’ 的转换无效
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-1-11 10:47:19 | 显示全部楼层
如果你要是把这句
s2 = "It's modified!";
改成
strcpy(s2, "It's modified!");
你就会发现问题了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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