如何修改const变量的值?

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

 #include 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); } 

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

 #include  int main(){ const int a = 0; *(int *)&a = 39; printf("%d", a); } 

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

更新:说明

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

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

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

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

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

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

试试这个让我知道。

如何修改const变量的值?

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

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

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

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

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

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

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

看看我们可以通过指针改变用const定义的对象的值吗?

长话短说,这是一个undefined behaviour 。 它可以依赖于编译器/机器。

如果在gcc中编译此代码,则无法修改const变量的值

 error: invalid conversion from 'const int*' to 'int*' [-fpermissive] 

并显示未定义的行为

maiin的事情是,我们只能在没有地址的情况下访问地址时修改变量,我们无法做任何事情。 这与Register存储类是一回事。