Можно ли выделить другое место в памяти для элементов структуры в C? - PullRequest
0 голосов
/ 06 сентября 2018

Для следующего объекта структуры

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

Ожидается, что для переменной a и переменной b для экземпляра test1 будут назначены разные области памяти.

Я понимаю, что такое возможно для глобальных переменных, используя #pragma address

Вопросы 1: Можно ли это распространить и на конструкции.

если нет, то

Вопрос 2: Как лучше это сделать?

Ограничения:

  1. Обе переменные должны логически оставаться вместе.
  2. Физические адреса должны быть отдельными (настраиваемыми каким-либо образом).

Редактировать 1: Для уточнения, приведенная выше структура содержит переменные, которые указывают места в определенном буфере. (Ближайшая аналогия - индексы чтения / записи в очереди) Здесь, однако, каждая переменная должна храниться в отдельном месте, чтобы быть защищенным от случайного доступа некоторыми модулями.

1 Ответ

0 голосов
/ 06 сентября 2018

По определению 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

... структура - это тип, состоящий из последовательности членов, чьи память распределяется в упорядоченной последовательности, ...

...