【问题标题】:Is it possible to allocate different memory location for structure members in C?是否可以为 C 中的结构成员分配不同的内存位置?
【发布时间】:2018-09-06 07:24:20
【问题描述】:

对于下面的结构对象

struct test
{ 
int a;       //expect address location 0xabcd
int b;       //expect address location 0xmnop
} test1;

期望为 test1 实例的变量 a 和变量 b 分配不同的内存位置。

我知道全局变量可以通过使用 #pragma 地址

问题 1:这也可以扩展到结构吗?

如果不是那么,

问题 2:有什么更好的方法来做到这一点?

约束是:

  1. 两个变量必须在逻辑上保持在一起。
  2. 物理地址必须是分开的(可以通过某种方式配置)。

编辑 1: 为了进一步澄清,上述结构包含指示某个缓冲区中的位置的变量。 (最接近的类比是队列中的读/写索引) 然而,在这里,每个变量都必须存储在单独的位置,以防止某些模块意外访问。

【问题讨论】:

  • 为什么? 您试图解决的真正问题是什么?这个问题是XY problem
  • 为什么?它甚至需要吗?您遇到的实际问题是什么?
  • struct test { int *a; int *b; } test1 = { 0xabcd, 0xmnop, }
  • 也许指针是您正在寻找的东西,但我并没有真正看到您要在这里完成什么。
  • @Lundin 我理解那里给出的答案,但我没有得到连接。我只是想说,这样的事情可能可以用指针来完成(就像你的回答一样)。并不是说添加* 是解决方案

标签: c memory-management data-structures pragma


【解决方案1】:

根据定义1)struct 的成员在内存中依次分配。此外,在不同的内存区域分配不同的结构成员没有任何意义。甚至在最奇特的嵌入式系统上也不行。

问题 1:不,您不能也不应该这样做。既不使用标准 C 语言,也不使用 #pragmas 之类的编译器扩展。

问题 2:使用指针。

typedef struct
{ 
  volatile uint32_t* a;
  volatile uint32_t* b;
} test_t;

test_t test = 
{ 
  .a = (volatile uint32_t*)0x1234;
  .b = (volatile uint32_t*)0x5678;
};

1) 从 C17 6.7.2.1 §6

...结构是由一系列成员组成的类型,其成员 存储按顺序分配,...

【讨论】:

  • 这就是我的想法。这是否有助于 OP 由他决定。
猜你喜欢
  • 2020-01-08
  • 2012-12-26
  • 2021-06-15
  • 2022-11-07
  • 2020-04-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 2021-06-04
相关资源
最近更新 更多