如何修改const变量的值?

use*_*970 5 c gcc const constants

我能够const在gcc 中更改修改变量的值,但在其他编译器中却没有.我在gcc上尝试了这个代码,它更新了ij(11)的值.使用在线编译器,我得到不同的值.

#include<stdio.h>
void main() {
  const int i=10;
  int *j;
  j = &i;
  (*j)++;
  printf("address of j is %p address of i is %p\n",j,&i);
  printf("i is %d and j is %d\n",i,*j);
}
Run Code Online (Sandbox Code Playgroud)

Sib*_*ran 17

是的,你可以用一点点黑客来做.

#include <stdio.h>
int main(){
    const int a = 0;
    *(int *)&a = 39;
    printf("%d", a);
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,a是一个const int.通过小黑客,您可以更改常量值.

更新:说明

在上面的代码中,a被定义为a const.例如,a有一个内存addr 0x01,因此&a返回相同的内存.当它被铸造时,(int *)它变成另一个变量,称为指向const的指针.当*再次访问它时,可以访问另一个变量而不违反const策略,因为它不是原始变量,但是反映了更改,因为它被称为指针的地址.

这适用于Borland C++或Turbo C++等旧版本,但现在没有人使用它.

这是"未定义的行为",意味着基于标准,您无法预测尝试此操作时会发生什么.根据特定的机器,编译器和程序状态,它可能会执行不同的操作.

在这种情况下,最常发生的是答案是"是".变量const或不变量只是内存中的一个位置,您可以破坏const的规则并简单地覆盖它.(当然,如果程序的其他部分依赖于其const数据是恒定的,这将导致严重的错误!)

但是在某些情况下 - 最常见的是const静态数据 - 编译器可能会将这些变量放在只读的内存区域中.例如,MSVC通常将const static int放在可执行文件的.text段中,这意味着如果你尝试写入操作系统将引发保护错误,程序将崩溃.

在编译器和机器的其他组合中,可能会发生完全不同的事情.您可以肯定的一件事是,这种模式会让任何必须阅读您的代码的人烦恼.

试试这个让我知道.


Alo*_*ave 8

如何修改const变量的值?

没有!您不应该修改const变量.
拥有const变量的全部意义是无法修改它.如果你想要一个你应该能够修改的变量,那么就不要const在其上添加限定符.

任何修改const强制通过(指针)hackery的代码都会调用Undefined Behavior.

未定义的行为意味着代码不符合C标准规定的标准规范,因此不是有效的代码.这样的代码可以显示任何行为,并且允许这样做.

  • 绝对!永远不要更改const变量.在某些嵌入式系统中,const变量存储在闪存而不是RAM中,因此无法更改. (2认同)
  • `const int r = rand();`不会存储在flash中.`const`并不意味着"常量",它意味着"只读". (2认同)
  • @YoTengoUnLCD告诉别人如何编写无效代码没有任何意义.解释它们为什么不应该这样做有助于达到目的.这可以有一个类比,如果一个人问如何从桥上跳,你不告诉他们如何,你告诉他们你是否会死,所以放弃这个想法. (2认同)

Kei*_*son 6

通过定义iconst,您承诺不会修改它.编译器可以依赖该承诺并假设它未被修改.当您打印值时i,编译器可以只打印10而不是加载当前存储的任何值i.

或者它可以选择加载值.或者,当您尝试修改时,它可能会导致程序崩溃i.行为未定义.

根据优化选项(-O1,-O3),您可能会看到gcc的不同行为.

哦,void main()是不正确的; 它应该是int main(void).如果你的教科书告诉你使用void main(),你应该得到一本更好的书.