4

可能重复:
C 中的常量和指针

我有这段小代码。我正在使用 gcc 编译器:

#include <stdio.h>

int main()
{
    const int a=10;
    int *d;
    d=&a;
    *d=30;
    printf("%d %d\n",a,*d);
    return 0;
}

它在编译时发出警告:

“赋值从指针目标类型中丢弃限定符”

但没有错误。输出为:30 30

那么它是否违背了维护 const 变量的目的,该变量的值在整个程序执行过程中都是固定的(如果我错了,请纠正我)?

4

3 回答 3

4

const不是保证。这只是一个承诺。承诺可以被打破。发生这种情况时编译器会发出警告,但不需要阻止它,因为在某些情况下绕过 const 可能有用。

于 2012-11-03T18:46:03.053 回答
2

The above behavior is undefined. As this example shows, you can get different values as well. Explanation for this output is - compilers optimize the code and replace const variables with their values. So we can see a difference when we do printf("%d %d %u %u\n",a,*d,&a,d); which would actually have been modified to optimize as printf("%d %d %u %u\n",10,*d,&a,d);

Do not rely on any of these outputs. Actual behavior is not defined by the standard.

于 2012-11-03T20:05:08.313 回答
0

你不应该这样做,编译器给你这个警告是有原因的。然而,C/C++ 会让你做任何你想做的事。编写干净的代码取决于您。

您可以使用以下方法反映该值的常量:

int const * d =  &a;    

然后,修改 d 指向的内容会产生警告和错误。

于 2012-11-03T18:52:21.203 回答