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

时间:2011-05-26 11:31:01

标签: c memory-management

这段代码是如何工作的?

#include <stdio.h>
#include <stdlib.h>

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

    return 0;
}

4 个答案:

答案 0 :(得分:6)

它的工作原理是假设0x4888d0是一个至少sizeof(int)字节的可写内存块的地址,它不会干扰printf或C运行时系统的功能。

或者更确切地说,它不起作用,至少不在我的系统上(Segmentation fault)。

答案 1 :(得分:0)

它没有什么奇怪的,但是,它看起来很危险。该程序尝试做的是在特定位置写入30。即地址包含在0x4888d0中的位置。

为什么这段代码是这样写的,为什么这个特定的地址,这是任何人的猜测。

答案 2 :(得分:0)

int *addr = (int*) 0x4888d0;会为地址=0x4888d0添加地址。该地址可能是有效地址。但无法保证它始终有效。

答案 3 :(得分:0)

如上所述,这往往会划分价值或损坏正常的应用程序。然而,

现代计算机倾向于保留内存地址,这些地址可以做出神奇的事情,比如控制I / O,设置CPU模式,更新内存映射等。具有此类内存页面的“真实”地址未映射到虚拟内存常规应用程序中。这就是内核与硬件控制器通信的地方。提供的片段戳存储器位置然后立即将其读回的事实通常是询问控制器某种类型的状态然后返回状态(对魔术字的任何写入都可以更新控制器提供给状态的状态。软件......价值可能并不重要。)

因此,如果此代码来自内核空间,或者如果这是在某些微控制器或其他奇怪的系统中,则可以使用魔术内存地址。另一种可能性是特权应用程序已经请求来自内核的特殊虚拟内存映射,该映射也可以向其公开魔术页面。这可能会变得奇怪,因为当应用程序请求将某些内容映射到虚拟内存位置(包括0x4888d0)时,实际内存页面可能会完全不同(并且对应用程序不可用)。