Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 22

Как привязать структуру к адресам памяти?

29.01.2021, 09:35. Показов 3516. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как привязать структуру к адресам памяти?

есть структура

C
1
2
3
4
5
struct  struct_pol {
    uint8_t  pol1;
    uint8_t  pol2;
    uint8_t  pol3;
} str ;
как положить её в память начиная с конкретного адреса, например 0x80000000?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.01.2021, 09:35
Ответы с готовыми решениями:

Как промежуточный указатель на структуру (node* p) переходит по адресам
#include <iostream> #include <conio.h> #include <iomanip> #include "MyLib.h" struct node { int info; struct node* next; //...

Модуль памяти с блоком контроля последовательности обращений к адресам памяти в группе заранее указанных адресов
Модуль памяти с блоком контроля последовательности обращений к адресам памяти в группе заранее указанных адресов. Устройство содержит...

IAR размещает структуру по непонятным адресам вне ОЗУ
Переношу пример DHCP для WIZNET W5100, где используется структура для формирования DHCP запроса. Выяснилось, что IAR почему то размещает...

29
фрилансер
 Аватар для Алексей1153
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,321
29.01.2021, 14:21
Студворк — интернет-сервис помощи студентам
ovn83, доступ к экземпляру структуры по указателю, иначе тут не сделать
0
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 22
29.01.2021, 14:52  [ТС]
http://www.cplusplus.com/doc/tutorial/structures/ здесь в ++ но вроде как то можно.
0
 Аватар для zeroalef
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
29.01.2021, 15:28
Цитата Сообщение от ovn83 Посмотреть сообщение
Как создать структуру, привязать к памяти и обращаться, как к структуре через . а не через ->?
C
1
2
3
(*pointer).field1 = 0x01;
(*pointer).field2 = 0x02;
...
но какой в этом смысл?

Добавлено через 4 минуты
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct foo {
  int a;
  int b;
};
 
 
int
main(int argc, char * argv[])
{
  void * p = (void *) 0x80000000;
  struct foo var = *((struct foo*) p);
 
  var.a = 1;
  var.b = 2;
  exit(EXIT_SUCCESS);
}
Добавлено через 2 минуты
но в данном примере адрес var не будет равен 0x80000000. Однако всегда можно изменить var и копировать ее с помощью memspy/memmove
0
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 22
29.01.2021, 15:57  [ТС]
C
1
(*pointer).field1 = 0x01;
просто другая запись ->

Когда и куда копировать адрес?
0
 Аватар для zeroalef
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
29.01.2021, 16:05
Цитата Сообщение от ovn83 Посмотреть сообщение
просто другая запись ->
снимаю шляпу, кэп
Цитата Сообщение от ovn83 Посмотреть сообщение
Когда и куда копировать адрес?
не адрес, данные копировать на адрес. Не понимаю почему вы хотите чесать ухо ногой, но я покажу вам как это сделать:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct foo {
  int a;
  int b;
};
 
 
int
main(int argc, char * argv[])
{
  void * p = (void *) 0x80000000;
  struct foo var = *((struct foo*) p);
 
  // здесь заполняете структуру данными
  var.a = 1;
  var.b = 2;
 
  // здесь копируете данные на адрес 0x80000000
  memmove(p, &var, sizeof(struct foo));
  exit(EXIT_SUCCESS);
}
но по нормальному это все будет так как уже описывалось выше -- разыменовывать указатель:
C
1
2
3
4
5
struct foo * p = (struct foo *) 0x80000000;
 
  // здесь заполняете структуру данными
  p->a = 1;
  p->b = 2;
0
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 22
29.01.2021, 16:37  [ТС]
Тут после каждой операции со структурой или памятью нужно копировать данные, в целом работает, но извращение.
0
фрилансер
 Аватар для Алексей1153
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,321
29.01.2021, 16:40
Цитата Сообщение от zeroalef Посмотреть сообщение
memmove(p, &var, sizeof(struct foo));
или
C
1
*(struct foo*)p=var;
2
 Аватар для zeroalef
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
29.01.2021, 16:44
Цитата Сообщение от ovn83 Посмотреть сообщение
в целом работает, но извращение
Зато не надо использовать оператор разыменовыания. Всё как вы хотели =)
0
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 22
29.01.2021, 17:04  [ТС]
C
1
*(struct foo*)p=var; // и наоборот
Зачёт

Добавлено через 14 минут
А как сообщить компилятору Си, где ему хранить переменные? Директивы есть какие-нибудь?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,316
29.01.2021, 20:03
Цитата Сообщение от ovn83 Посмотреть сообщение
Как создать структуру, привязать к памяти
Никак. Либо создать, либо привязать.

Цитата Сообщение от ovn83 Посмотреть сообщение
и обращаться, как к структуре через . а не через ->?
Ну так никто вас не заставляет использовать ->. Пользуйтесь комбинацией * и .. Вот вам и будет "через ."

C
1
2
3
(*p).pol1 = 0x1;
(*p).pol2 = 0x2;
(*p).pol3 = 0x3;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.01.2021, 20:03

[ЛамПанель] Запись и очистка памяти по адресам
Запишите число а в память по адресу 72 (16) , а b — по адресу 74 (16) . Вычислите с = \а — 7b\ и сравните с d. Если с > d, то очистите...

Массив: К элементам по четным адресам добавить 1, из элементов по нечетным адресам вычесть 1.
К элементам по четным адресам добавить 1, из элементов по нечетным адресам вычесть 1. Четность проверять не надо так как элемент...

Запись в ячейки памяти по адресам $0100...$010F (ASM, HCS12 ElvisII)
Помогите пожалуйста! программы написаны, но не отрабатывают, а я не знаю как их исправить. P.S. уважаемые модераторы, я знаю, что одна...

Как удалить из памяти структуру?
WorldInfo MakeWorldFromScratch(string name, int width, int height, int dirtType = 2, int lavaType = 4, int mainDoorType = 6, int...

Ввод данных с внешних устройств по адресам 28h и 35h в ячейки памяти с адресами AB00h и AB01h
Скласти програму введення даних з зовнішніх пристроїв за адресами 28h і 35h в комірки пам'яті з адресами AB00h і AB01h відповідно. За...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru