【问题标题】:Const not being const? [duplicate]常量不是常量? [复制]
【发布时间】:2016-10-29 15:32:41
【问题描述】:

我的问题是为什么变量 a 的值会发生变化,尽管我已将其声明为 const?对不起,如果这是一个微不足道的问题。

const int a = 8;
int* ptr = &a;

printf("variable: %d \n", a);
printf("pointer: %d \n", *ptr);

*ptr = 1;
printf("pointer: %d \n", *ptr);
printf("variable: %d \n", a);

输出:8 8 1 1

谢谢,祝你有美好的一天!

【问题讨论】:

  • 所以你问如果违反保证的合同,为什么代码会暴动?但是你的编译器应该已经警告过了,你有什么理由忽略它吗?注意:C 没有除 enum-constants 以外的符号常量。
  • 一般来说,C 语言标准确实允许从'pointer to const' 转换为'pointer to non-const',所以程序在运行时的确切行为是不确定的。更具体地说,这个程序的运行时行为是依赖于编译器的。如果编译器在可执行映像的只读段分配 const 变量,那么在执行 *ptr = 1 行时,您将遇到内存访问冲突(又名 segmentation fault)。如果它在可执行映像的读写段上分配它们,则该行将成功执行。

标签: c pointers constants


【解决方案1】:

您已将a 限定为const,但是当您将其地址分配给指针时,这会丢弃const 的效果,现在可以使用ptr 轻松操作a。这很可能会调用未定义的行为。

当你编译你的程序时,GCC 会显示一个警告:

warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
        int* const ptr = &a;

如果您不想体验这种效果,请将指针变量声明为指向常量的指针。 示例:const int* ptr=&a;

【讨论】:

  • 为什么投反对票?
  • 令人惊讶!你的答案是正确的。你应该说这种行为是未定义的......
  • 是的,我在最初发布后进行了编辑。
  • @Jean-BaptisteYunès:答案正确!
  • 你能解释为什么@Olaf?
猜你喜欢
  • 2012-12-01
  • 2012-06-10
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
相关资源
最近更新 更多