@lacredin
Программист

Какова адресация элементов структуры в си?

Я в своей работе хочу получить именованный массив, но без увеличения расходуемой памяти, так как пишу для микроконтроллеров.
Пришла в голову идея использовать структуру вместо массива, но получить возможности массива, путём манипуляций с адресами.
Вот так это будет примерно выглядеть:

typedef struct{
	int var1;
	int var2;
}vars; 

void func(){
	vars array;
	array.var1 = 10;//стандартная работа со структурой
	int index = 0;
	index = (int)&array - (int)&array.var2;//получение позиции переменной относительно начала структуры
	
}


Собственно вопрос, структура будет хранить переменные в том же порядке, что я их записал?
Порядок очень важен.
  • Вопрос задан
  • 270 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Да, будет хранить в том порядке, в котором записал. Гуглите понятие POD = Plain old data.
en.cppreference.com/w/c/language/struct
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Ocelot
@Ocelot
На усмотрение компилятора. Можно явно указать ему, как размещать структуру в памяти, при помощи #pragma pack, но это на крайний случай. Представление структуры в виде массива (например, чтобы передать её куда-нибудь побайтно) называется сериализация. Обратная операция - десериализация.
Ответ написан
Комментировать
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
отключать оптимизацию при компиляции через -O0 (первый символ - буква O, второй - цифра "ноль"!). Это отключит механизмы оптимизации размещения обьектов в памяти и еще много чего, что не дает нормально отлаживаться.
Можно явно задать выравнивание элемента на границу байта, слова, двойного слова - через #pragma pack. В данном случае нужно позаботиться, чтобы структура была выравнена на границу int - в зависимости от того, какой у данного контроллера int - в два байта, в четыре...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы