有什么方法可以改变用c中的const限定符定义的变量中的值?

时间:2011-06-29 05:09:49

标签: c

我现在要了解的一件事。问题是关于C中的const限定符。在我的程序中,我想要更改用const限定符定义的变量的值。

例如:

int main()
{
const int i=40;
i=50 ;  // error
}

但是在上面的例子中有没有办法改变i的值。请让我知道。 谢谢

3 个答案:

答案 0 :(得分:7)

在任何具有明确定义的行为的程序中,i都无法修改。

C99§6.7.3(“类型限定词”)/ 5明确说明:

  

如果尝试通过use修改使用const限定类型定义的对象   对于具有非const限定类型的左值,行为是未定义的。

i是使用const限定类型(const int)定义的对象。它是一个不可修改的左值:你不能修改它,因为它是const限定的。修改它的唯一方法是使用强制转换去除const限定,这将导致程序显示未定义的行为。

答案 1 :(得分:5)

首先,你可能不应该这样做。

其次,是的,如果您必须通过获取其地址并参考它,那么您可以:

const int i = 40;
*(int*)&i = 50;
// i is now 50

请第三,请不要这样做。

编辑:正如其他人指出的那样,这表现出未定义的行为。您假设您的编译器将此值存储在可寻址的位置,而不是必须的。 (一个常数值可以用它的直接值代替,并且“使用它的地址”并不意味着什么。)你被警告了。

答案 2 :(得分:4)

有两种方式。

首先是一种你不感兴趣的方式。标准允许这种情况发生,但你可能无法控制它,所以你并不感兴趣。标准说你可以定义像

这样的东西
const volatile int *pSomething;

因为实现可能会改变指向的东西(例如它可能是一个计时器)但你可以禁止你的程序更改它。

第二种是您感兴趣的方式,但标准不允许。颜已经给出了这样的答案。

*(int*)&i

是一个可修改的左值,根据什么是可修改的左值的规则。但是,如果您实际尝试修改此左值,则违反标准,因为实际对象i被定义为const。结果是未定义的行为。实现可能会做你想要的,或者它可能会保持不变,它可能会中止你的程序,或者它可能会格式化你的硬盘。

这是一种做你想做的事情的方法。

int theRealI;
const int *pTheRealI = &theRealI;
#define i (*pTheRealI)

然后我将是只读的,但是如果你想修改你的实力,你可以。