use*_*970 5 c gcc const constants
我能够const在gcc 中更改修改变量的值,但在其他编译器中却没有.我在gcc上尝试了这个代码,它更新了i和j(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段中,这意味着如果你尝试写入操作系统将引发保护错误,程序将崩溃.
在编译器和机器的其他组合中,可能会发生完全不同的事情.您可以肯定的一件事是,这种模式会让任何必须阅读您的代码的人烦恼.
试试这个让我知道.
如何修改const变量的值?
没有!您不应该修改const变量.
拥有const变量的全部意义是无法修改它.如果你想要一个你应该能够修改的变量,那么就不要const在其上添加限定符.
任何修改const强制通过(指针)hackery的代码都会调用Undefined Behavior.
未定义的行为意味着代码不符合C标准规定的标准规范,因此不是有效的代码.这样的代码可以显示任何行为,并且允许这样做.
通过定义i为const,您承诺不会修改它.编译器可以依赖该承诺并假设它未被修改.当您打印值时i,编译器可以只打印10而不是加载当前存储的任何值i.
或者它可以选择加载值.或者,当您尝试修改时,它可能会导致程序崩溃i.行为未定义.
根据优化选项(-O1,-O3),您可能会看到gcc的不同行为.
哦,void main()是不正确的; 它应该是int main(void).如果你的教科书告诉你使用void main(),你应该得到一本更好的书.