const不应该是常数吗?

时间:2010-08-17 06:49:10

标签: c

查看此代码

#include<stdio.h>

int main()
{

 const int a=7;
 int *p=&a;
 (*p)++;
 printf("*p=%d\np=%u\na=%d\n&a%u",*p,p,a,&a);
 getch();
}

你得到的输出是

*p=8
p=1245064
a=8
&a1245064

这怎么可能?我们将变量a声明为常量。这是否意味着在pgm执行过程中,a指向的位置永远不会改变?

5 个答案:

答案 0 :(得分:5)

这是未定义的行为 - 在您的情况下,它正如您所描述的那样工作,但它也可能导致程序崩溃或导致任何其他问题。在您的情况下,const不会阻止编译器在可修改的内存中分配变量,因此您在技术上可以通过获取指向该变量的指针并通过指针来修改它。

答案 1 :(得分:3)

不依赖未定义的行为; - )

答案 2 :(得分:1)

如果实际上阻止它工作,你真的想要使用C吗?它以这种方式运作的事实非常符合语言的精神。

答案 3 :(得分:1)

阅读你的评论“它只会发出警告,指出可疑的指针转换”应该足够明确,以推断出你正在做违法的事情。

您要为int *变量分配const int *值。

事实上,C没有任何运行时检查来阻止您修改该内存地址并不意味着它是允许的! (事实上​​,静态类型系统检查告诉你)。

答案 4 :(得分:1)

如果你的问题没有自动检测到,那就给自己一个不错的编译器吧。 E.g clang给了我4个代码问题:

clang    -c -o test-const.o test-const.c
test-const.c:17:7: warning: initializing 'int const *' discards qualifiers, expected 'int *' [-pedantic]
 int *p=&a;
      ^ ~~
test-const.c:19:20: warning: conversion specifies type 'unsigned int' but the argument has type 'int *' [-Wformat]
 printf("*p=%d\np=%u\na=%d\n&a%u",*p,p,a,&a);
                  ~^                 ~
test-const.c:19:32: warning: conversion specifies type 'unsigned int' but the argument has type 'int const *' [-Wformat]
 printf("*p=%d\np=%u\na=%d\n&a%u",*p,p,a,&a);
                              ~^         ~~
test-const.c:20:2: warning: implicit declaration of function 'getch' is invalid in C99 [-Wimplicit-function-declaration]
 getch();
 ^
4 diagnostics generated.

这些都是严重的问题。