C语言中奇怪的内存分配代码,它如何工作?

问题描述

| 此代码如何工作???
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *addr = (int*) 0x4888d0;
    *addr = 30;
    printf(\"%i %p\\n\",*addr,addr);

    return 0;
}
    

解决方法

它的工作原理是假设a1ѭ是至少
sizeof(int)
字节的可写内存块的地址,并且不干扰
printf
或C运行时系统的功能。 或者更确切地说,它不起作用,至少在我的系统上不起作用(
Segmentation fault
)。     ,它没有什么奇怪的,但是,这似乎很危险。该程序尝试执行的操作是在特定位置写入30。即地址位于0x4888d0中的位置。 为什么这样写代码,为什么要写这个特定地址,这是任何人的猜测。     ,
int *addr = (int*) 0x4888d0;
将给addr地址
=0x4888d0
。该地址可能是有效地址。但是不能保证它会一直有效。     ,如上所述,这往往会分割价值或破坏正常的应用程序。然而, 现代计算机趋向于保留做一些神奇的事情的内存地址,例如控制I / O,设置CPU模式,更新内存映射等。具有此类的内存​​页面是未映射到常规应用程序获得的虚拟内存中的“真实”地址。这就是内核与硬件控制器通信的地方。提供的片段会戳入一个内存位置,然后立即将其读回,这一事实通常是向控制器询问某种类型的状态,然后又将其取回(对魔术字的任何写操作都可以更新控制器可用于该状态的状态)。软件...该值可能并不重要)。 因此,如果此代码来自内核空间,或者位于某些微控制器或其他奇怪的系统中,则魔术内存地址可能可用。另一种可能性是,特权应用程序已从内核请求特殊的虚拟内存映射,该映射也可以向其公开魔术页面。当应用程序请求将某些内容映射到虚拟内存位置(包括0x4888d0)时,这可能会很奇怪,而实际内存页面可能会完全不同(并且对于应用程序不可用)。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...