【问题标题】:Fixed Memory location in C修复了 C 中的内存位置
【发布时间】:2013-08-02 13:49:34
【问题描述】:

使用指针分配地址为0x67AB 和值0x1234 的内存位置。 我正在尝试使用指针分配内存中的固定位置,而不是使用malloc()

【问题讨论】:

  • 一般来说,这样的代码很可能会崩溃。您是否有额外的信息(未包含在问题中)来保证此地址可由您的代码写入?
  • 你有没有保证可以写入地址0x67AB?
  • @simonc 在 micro-crontoller 中的编程充满了不会崩溃的活动。
  • @chux 同意。这个问题没有提到代码是针对微控制器的。鉴于此级别的大多数问题来自刚开始学习 C 的人,OP 似乎可能希望在桌面上运行此代码。

标签: c memory memory-management


【解决方案1】:

以下代码将0x1234 写入执行进程地址空间中的地址0x67AB,前提是您的C 实现支持此行为(因为它超出了C 标准的要求)。您可能需要使用uint16_t 以外的类型,具体取决于您的具体需求。如果您不知道自己在做什么,则此代码可能会失败或导致其他问题:

#include <stdint.h>
…
* (uint16_t *) 0x67AB = 0x1234;

【讨论】:

  • +1 我喜欢*(uint16_t *) 0x67AB = 0x1234;的简洁。
【解决方案2】:

如果您的程序在操作系统下运行,您将无法写入修复位置。为了做这样的事情,您的程序需要具有 root 访问权限并进行系统调用,以便操作系统本身在该位置写入。

但是,如果您正在为微控制器或嵌入式系统编写程序,您可以这样做:

char* p = (char*)0x67AB;
p[0] = 0x12; // You need to write each byte at a time.
p[1] = 0x34;

【讨论】:

  • 在具有虚拟地址空间的操作系统下运行可防止您写入任意物理内存地址。如果该地址已映射,它不会阻止您写入固定的虚拟内存地址。如果链接到进程的加载程序或程序部分保证某些地址用于某些事情,则很少有这样做的机会。
  • 是否必须一次写入一个字节,以及这是否是正确的写入顺序,取决于实现。 67ABh 也不是标准的 C 语法。它应该是0x67AB,并且应该转换为char *
  • 我认为你是对的。很久没有写纯C了,所以记不太清了。不过,我想我现在修好了。
  • 您所做的修复不处理字节序问题。在小端架构中,应该是p[0] = 0x34; p[1] = 0x12;。此外,不需要一次写入一个字节。可以使用* (uint16_t *) 0x67AB = 0x1234; 并在 16+ 位嵌入式系统上同时写入 2 个字节。
【解决方案3】:

假设您知道如果可以的话写入特定地址,例如在 PIC 或控制器中:

#include <stdint.h>
int16_t *ptr = (int16_t *) 0x67AB;
*ptr = 0x1234;

由于未指定整数的字节序,逐字节设置可能无法提供预期的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多