【问题标题】:Why does this code works changing constant integer? [duplicate]为什么这段代码可以改变常量整数? [复制]
【发布时间】:2017-07-15 13:32:50
【问题描述】:
int const i = 10;
int *j = &i;
*j = 20;
printf("%d",i);

如果 i 是常量,即使通过指针也不应该改变它。如果不是,它不改变的条件是什么?

【问题讨论】:

  • 编译器不会警告你这个初始化int *j = &i;吗?我希望它会发出这样的消息:“警告:初始化从指针目标类型中丢弃‘const’限定符
  • 未定义的行为是未定义的。
  • 又不是这个:(

标签: c


【解决方案1】:

编译器应该为此行发出警告:int *j = &i;。你让一个非 const 限定的指针指向一个 const 限定的对象。

当您稍后尝试通过 j 指针修改 i 时,行为未定义:

  • 如果i 是可写的,它可能会被修改,这就是你观察到的。
  • 但如果您在文件范围内定义 i,编译器可能会将其定位在只读段中,并且尝试可能会因段错误而失败。
  • 其他任何事情都可能发生,包括总统崩溃。

尝试编译并运行这个程序:

#include <stdio.h>

int const i = 10;

int main(void) {
    int *j = &i;
    *j = 10;
    printf("%d\n", i);
    return 0;
}

【讨论】:

  • 我喜欢你说明潜在灾难的方式。
  • 在目前的美国,总统的崩溃不必归咎于代码错误。
  • @aschepler:可能是不良行为准则?还是投票机中的错误代码?
  • @aschepler 真的吗?我把所有的时间都浪费在编写糟糕的代码上,却没有达到预期的效果?
【解决方案2】:

You can change a const variable but the behavior is undefined

您的编译器应在以下行中警告const 的丢失,

int *j = &i;

所以const 的工作方式与此完全相同,它只是防止您意外更改const 变量,因为您会在使用它之前听取编译器并修复您的代码。

但是,您不能直接分配给i

但是通过指针你总是可以摆脱const。最终行为是否已定义,在您摆脱 const 之前您应该知道这一点,这有时很好,但如果您必须这样做,则可能意味着您遇到了设计问题。

【讨论】:

  • int *j = &amp;i;,带有警告的行,是初始化,而不是赋值。)
  • @aschepler 是的,但在这两种情况下都是同一个问题。我认为我现在对警告的回答更清楚了。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2019-10-25
相关资源
最近更新 更多