【问题标题】:How to Assign an array to specific memory address in C [duplicate]如何将数组分配给C中的特定内存地址[重复]
【发布时间】:2019-04-29 14:07:52
【问题描述】:

很抱歉,我知道这是非常基本的问题,但我不得不问。 我有一个整数类型的数组,我想将它分配给特定的内存地址。我怎样才能用 C 语言做到这一点? 例如 ; 整数输入[10] ={4,10,89}; 所以我想将此输入分配给 0x20000001。

非常感谢。

【问题讨论】:

  • 在大多数情况下,你不应该尝试这个;您应该让 C 实现分配内存位置。并不是所有的内存都可以在程序中免费使用——C 实现,包括操作系统和加载器,已经安排将部分内存用于程序代码,部分用于堆栈,部分用于动态分配的内存,等等。你不能只取你选择的一部分而不可能干扰它。在某些情况下,有一些方法可以请求特定的内存地址,但它们用于特殊目的。为什么要这样做?
  • @EricPostpischil 嵌入标签解释了原因。它不是个人电脑。
  • 什么编译器?为什么需要具体地址? GCC 的一种可能性是 __attribute__ ((section (".mySection"))) 但这取决于你想要做什么
  • @Lundin:嵌入式标签提供了线索。它不回答。是否应该使用硬编码常量、供应商提供的标头中提供的地址、链接器中的分配、内核例程返回的地址或其他方式分配指针,取决于具体情况。
  • @EricPostpischil Embedded = 硬件相关。正如我们所说,我正在编写一个 eeprom 驱动程序,并直接访问物理内存的绝对地址。每天都有嵌入式系统编程。

标签: c embedded


【解决方案1】:

除非您正在管理您的内存分配区域,例如使用链接描述文件或其他方式,否则您不应该这样做。编译器会为您处理所有内存分配,并且不提供任何预定义内存地址的方法。

但是,如果你知道自己在做什么,你可以使用指针来处理它:

int *array = (int*)0x2000000; 

现在您可以逐个元素或按 memcpy 初始化它。

memcpy(array, inputs, sizeof(inputs));

【讨论】:

  • 使用不符合volatile 条件的指针几乎肯定是一个错误。使用签名的int 而不是uintxx_t 几乎可以肯定是一个错误。
  • 感谢分享@Serge 我会尝试分享结果。
  • @Lundin volatile 如果有机会从线程或外围源异步更新此内存区域,则需要。这里不需要。
  • 这样做的唯一原因是:内存映射寄存器或某种内存处理。如果它是真正的 ROM,那么你应该读取一个 const 限定的变量而不是一个绝对地址。
  • 我不认为 OOP 真的是这个意思 :-)
【解决方案2】:

如果您正在访问内存的受限区域,您可能会因为内存访问冲突而出现段错误,但如果您知道要写入的地址,这里有一个快速代码来测试它:

int address = 0x20000001;
int *ptr;
ptr =  (int*) address;
*ptr = inputs;

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    相关资源
    最近更新 更多