为什么我能在这里更改const int的值?

时间:2013-05-06 01:30:07

标签: c pointers

我的代码:

#include <stdio.h>
main()
{
    const int x = 10;
    int *p;
    p=&x;
    *p=20;
    printf("Value at p: %d \n",*p);
    printf("Value at x: %d", x);
}

我得到的输出是:

  

p:20的价值   价值在x:20

因此,改变常量变量的值。这是使用指针的缺点之一吗?

5 个答案:

答案 0 :(得分:2)

您使用int*指向const int。你应该得到:

 error: invalid conversion from ‘const int*’ to ‘int*’

当你这样做时:

p = &x;

你可能需要更新你的编译器,一个体面的编译器应该告诉你这个错误或至少给你警告。

答案 1 :(得分:0)

请检查以下错误消息:

error: invalid conversion from ‘const int*’ to ‘int*’

const intint constconst int *int const *,请参阅此帖:const int = int const?

这就是你如何使用它。

答案 2 :(得分:0)

那是因为您以错误的方式使用C语言,编译器允许您编译此代码,同时仅提供警告

warning: assignment discards ‘const’ qualifier from pointer target type [enabled by default]

在SO上有答案,例如warning: assignment discards qualifiers from pointer target type

答案 3 :(得分:0)

任何体面的编译器都会告诉您丢弃const限定符。

C假设程序员总是正确的,因此您可以选择忽略编译器的警告。像往常一样,只要你知道自己在做什么,这不是一个缺点!

答案 4 :(得分:0)

正如其他答案所指出的那样,编写一个程序来尝试修改const限定变量,这会导致程序具有未定义的行为。这意味着你的程序可以做任何事情 - 作为一个例子,当我编译启用了优化的程序时,我看到了这个输出:

Value at p: 20
Value at x: 10

..如果我将static限定符添加到变量x,那么程序会在运行时崩溃。