改变常量全局变量

时间:2014-10-29 09:08:23

标签: c constants

在另一个模块中定义了一个常量全局变量。

我想在运行时操作这个变量(因为我无法在其他模块中更改并删除co​​nst关键字)。

我知道常量放在ROM中......

代码将下载到微控制器(leopard powerpc 5643),所以我认为常量将存在于闪存中(不是普通的PC ROM)

我尝试了类似的东西,编译器在编译期间产生了错误:

const int global_Variable = 0;
const int* ptr = &global_Variable;
*ptr = 5;

那么,你知道其他任何方法吗?

2 个答案:

答案 0 :(得分:4)

如果您知道该常量确实存放在您的平台上的ROM(或更可能是闪存)中,那么您当然无法修改它,至少不能直接修改它。

如果它是闪存,你可能,但由于重新编程闪存完成,你将不得不深入潜水只需写入它,您必须擦除相关部分,并且通常有块/扇区大小限制要处理。它不会很漂亮。

您的实际代码无法编译,因为您无法通过const指针(毕竟这是const的点)。您可以抛弃它并强制编译器生成写入,但如果目标地址指向不可写的内存,它当然不会工作

const int global_Variable = 0;
int *ptr = (int *) &global_Variable; /* Cast away the const. */
*ptr = 5; /* Do the write! */

如果global_Variable位于不可写内存中,则再次 。你会得到不确定的结果。

最后,这是显而易见的,我甚至没想过要写它:你所做的事情听起来很糟糕。显然,您正在处理的软件的设计假设global_Variable 常量。你试图推翻设计的那个特定部分,如果你成功的话很可能会破坏很多东西。换句话说:考虑不要这样做。

答案 1 :(得分:0)

如果您设法将global_variable放在可写的内存区域中,可以使用以下方法更改其值。请注意,如果global_variable在物理上无法写入,则无法使用此功能,例如:因为它位于ROM区域。

int *ptr = (int*)&global_variable; /* the compiler will warn you about this */
*ptr = 5;

请注意,您可能会遇到其他问题,因为编译器可能会认为声明为const的变量的内容在程序运行时期间不会更改。你通过改变变量的值来违反这个断言,所以期待奇怪的结果。