LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: aishen944

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

[复制链接]
发表于 2006-1-11 11:17:42 | 显示全部楼层
Post by Lolita
我这里没有楼主所说问题,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 11:35:13 | 显示全部楼层
Post by herberteuler
为啥你的编译器的错误和警告是中文的?

我也不知道赫赫。。。
我的locale是zh_CN.UTF-8,是不是这个原因
回复 支持 反对

使用道具 举报

发表于 2006-1-11 13:03:08 | 显示全部楼层
似乎C语言中用字符串常量给char*变量复制的时候是先创建字符串常量,再将地址赋值给变量。

  1. $ cat const.c
  2. #include <stdio.h>

  3. int main()
  4. {
  5.         const char* s1 = "test";
  6.         char* s2 = s1;
  7.         printf("%s\t%d\n%s\t%d\n", s1, s1, s2, s2);
  8.         s2 = "modified";
  9.         printf("%s\t%d\n%s\t%d\n", s1, s1, s2, s2);
  10.         return 0;
  11. }
  12. $ gcc -Wall -o const const.c
  13. const.c: In function ‘main’:
  14. const.c:6: warning: initialization discards qualifiers from pointer target type
  15. const.c:7: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘const char *’
  16. const.c:7: warning: format ‘%d’ expects type ‘int’, but argument 5 has type ‘char *’
  17. const.c:9: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘const char *’
  18. const.c:9: warning: format ‘%d’ expects type ‘int’, but argument 5 has type ‘char *’
  19. dxy@dengxy:~/Projects/test$ ./const
  20. test    134513976
  21. test    134513976
  22. test    134513976
  23. modified        134513994
复制代码

因此,用s1给s2赋值,s2指向s1指向的地址;而用字符串常量给s2赋值之后s2应指向新的字符串常量的地址。因此楼主的情况显然是不正常的。

难道gcc 3.2.3不符合C标准?
回复 支持 反对

使用道具 举报

发表于 2006-1-11 14:26:57 | 显示全部楼层
Post by gamedragon
如果你要是把这句
s2 = "It's modified!";
改成
strcpy(s2, "It's modified!");
你就会发现问题了。


怎么能用strcpy? 即使s1不是const,strcpy也是不能用的
回复 支持 反对

使用道具 举报

发表于 2006-1-11 23:51:22 | 显示全部楼层
楼主搞清楚阿,一个const指针传递给另外一个指针,那么对新指针的任何操作是不会受原指针访问设置而约束的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-12 14:08:32 | 显示全部楼层
不好意思啊!其实是我弄错了!应该是下面两种情况!!!
c language
int main() {
   const int i = 10;
   int* j = &i;
   *j = 100;
   printf("i:%d\nj:%d\n",i,*j);
}
out : 100
         100

c++ language
int main() {
   const int i = 10;
   int *j = &i;
   
   ...
}
编译通不过
回复 支持 反对

使用道具 举报

发表于 2006-1-12 19:56:46 | 显示全部楼层
Post by aishen944

   const int i = 10;
   int* j = &i;
   *j = 100;


正象 pluskid 所说, 在 C 里面 const 的一个更恰当的名字是 readonly.

const int i; 的意思是你不能通过 i 这个名字来修改其值, 但并没有禁止你
用其他的方法修改它的值, 例如说
int *j = &i; *j = 100;
这种方式.
回复 支持 反对

使用道具 举报

发表于 2006-1-13 07:59:37 | 显示全部楼层
Post by MMMIX
正象 pluskid 所说, 在 C 里面 const 的一个更恰当的名字是 readonly.

const int i; 的意思是你不能通过 i 这个名字来修改其值, 但并没有禁止你
用其他的方法修改它的值, 例如说
int *j = &i; *j = 100;
这种方式.

话虽如此,但c标准不允许你这样做
  1. Both operands are pointers to qualified or unqualified versions of compatible types, and the type pointed to by the left has all the qualifiers of the type pointed to by the right.
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-1-13 09:06:37 | 显示全部楼层
Post by MMMIX
正象 pluskid 所说, 在 C 里面 const 的一个更恰当的名字是 readonly.

const int i; 的意思是你不能通过 i 这个名字来修改其值, 但并没有禁止你
用其他的方法修改它的值, 例如说
int *j = &i; *j = 100;
这种方式.

const限制的只是一个符号。理解这一点就好办了。
回复 支持 反对

使用道具 举报

发表于 2006-1-13 10:04:18 | 显示全部楼层
Post by rickxbx
怎么能用strcpy? 即使s1不是const,strcpy也是不能用的

就是这个意思啊。
回复 支持 反对

使用道具 举报

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

本版积分规则

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