微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用指针覆盖C中的const内存块?

如何解决如何使用指针覆盖C中的const内存块?

Program1.c

const int a = 5;
int *ptr = &a;

printf("%x",ptr);
//-> 0x89FC32 (let's suppose we get this address.)

*ptr = 8; /*Invalid move.*/

Program2.c

int *ptr = 0x89FC32;
*ptr = 8; /*Valid.*/

所以我的问题在第一个程序中,当我将该块固定为a的存储位置时,在程序终止后,该块究竟发生了什么?编译器是否能够从该特定块中删除const限定符?我可以覆盖该内存块,如果可以的话,该怎么做呢?

我想通过写入const内存块来终止程序而导致段错误。如果我尝试执行此操作,则编译器将仅引发错误,但是我想在运行时由于分段错误而杀死整个程序。有什么办法吗?

解决方法

程序终止后,该块到底发生了什么?

您的流程virtual memory所发生的情况由操作系统决定。程序终止时,操作系统将清除为程序分配的所有内存,无论该内存用于什么用途。 const的概念与此无关。

编译器是否能够从特定块中删除该const限定符?我可以覆盖该内存块,如果可以的话,该怎么做呢?

您不能更改变量的声明方式。它在整个生命周期中都保持这种状态。您将无法执行此操作,即使如此,尝试进行操作仍是undefined behavior

如果我需要覆盖const个内存块怎么办?有什么办法吗?

如果您需要执行此操作,则编写的任何程序的逻辑都是有缺陷的。您不能也不应这样做。这是未定义的行为,在最佳情况下,将使用segmentation fault杀死您的程序。


好吧,如果您真的想杀死由于写入const变量而导致的分段错误,请假设您的编译器将全局const变量放在只读段中(例如.rodata,那么以下内容就足够了:

const static int global = 123;

int main(void) {
    int *ptr = (int *)&global;
    *ptr = 456;

    // or,equivalent
    const int *ptr2 = &global;
    *(int *)ptr2 = 456;
}

您需要“舍弃” const限定词,以使编译器不会将其视为错误。同样,这仅在编译器将global放入只读部分(标准不需要)的情况下有效。如果这不会导致分段错误,则意味着您的编译器不会将所有const变量都放在只读节中。

,

这完全取决于实现。例如,裸机ARM uC上的const数据存储在闪存中。您可以在此处写信,但完全没有效果。

托管系统的行为将取决于操作系统,其版本和硬件。

How can I overwrite a const block of memory 只是如果您要编写,请勿声明const。如果您确实遵守对编译器的承诺。

如果只是初学者的好奇心,那就没有别的尝试方法了。实验,调试并尝试解释结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。