【问题标题】:Why was I able to change the value of a const int here? [duplicate]为什么我能够在这里更改 const int 的值? [复制]
【发布时间】:2013-05-06 01:30:07
【问题描述】:

我的代码:

#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

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

【问题讨论】:

  • C 不会阻止你做这样的蠢事。不过,您确实会收到编译器的警告:const.c:9: warning: assignment discards qualifiers from pointer target type
  • #include "stdio.h" => #include &lt;stdio.h&gt;
  • 请注意,根据启用的编译器和优化,您可能会在输出“x 处的值:10”中得到。
  • 我能看到的 C 语言中唯一有用的const 是在参数中。

标签: c pointers


【解决方案1】:

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

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

当你这样做时:

p = &x;

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

【讨论】:

  • 但他没有,我猜是因为他使用的编译器不好。
  • @Elazar 我想是的。或者可能是旧版本的编译器
  • 我使用 gcc!我认为 gcc 已经足够好了!
  • @user2350631 我也用gcc,是什么版本?
  • @user2350631 gcc 4.7.3 报错。
【解决方案2】:

请检查以下错误信息:

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

const intint constconst int *int const *,请看这个帖子:const int = int const?

这就是你如何使用它。

【讨论】:

    【解决方案3】:

    那是因为你以错误的方式使用 C 语言,编译器让你编译这段代码时只给出警告

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        Value at p: 20
        Value at x: 10
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-23
          • 1970-01-01
          • 2021-03-23
          • 2012-09-02
          • 1970-01-01
          相关资源
          最近更新 更多