c - c语言改变const变量和静态const变量的值
问题描述
我有两个程序:
第一个程序:
#include<stdio.h>
int main()
{
static const int a = 10;
int * b;
b = &a;
*b = 200;
printf("%d", a);
return 0;
}
第二个程序:
#include<stdio.h>
int main()
{
const int a = 10;
int * b;
b = &a;
*b = 200;
printf("%d", a);
return 0;
}
第一个程序有一个运行时错误:“总线错误:10”,但第二个程序运行良好。你能告诉我这两个程序中的 const 和 static const 有什么区别吗?
解决方案
int *b; b = &a; *b = 200;
两个程序都执行调用未定义行为的语句,因为a
它是 a const int
,因此不应修改。没有正确的答案(预期的输出)——崩溃和不崩溃都是可以接受的结果,打印10
或200
(或者lemons and oranges
——尽管这不太可能发生)。
不要执行任何导致未定义行为的事情!
你的编译器应该抱怨;注意它的警告。如果它没有抱怨,请获得更好的编译器。
不同之处在于static const int a = 10;
变量被放置在只读段中(可能是文本段的一部分,尽管这并不重要),因此系统可以在您写入它时发现并导致崩溃。另一方面,const int a = 10;
放置在堆栈上,并且堆栈是可修改的,因此您不会崩溃。
推荐阅读
- python - 当字典被覆盖时如何修复类变量/常量?
- spring - Spring 文件入站适配器 - 优先于具有单通道的目录
- python - pct_change 与 python 中的多索引
- javascript - 在 javascript 中声明许多提供类似服务的模块的正确位置
- tensorflow - 如何抑制来自 TensorFlow 对象检测 API 的输出?
- c - 如何在C中解析数学表达式
- html - Bootstrap HTML 表单仅发送最后一个数据条目
- php - Symfony - 我想使用 Doctrine 在日期之间划分我的数据字段
- python - 两个相同值的差异不为零
- google-maps-markers - Android - 如何让谷歌地图显示一条为连续闪烁点设置动画的折线