Форум программистов, компьютерный форум CyberForum.ru

Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? - C++

Восстановить пароль Регистрация
 
Jariel
 Аватар для Jariel
2 / 2 / 0
Регистрация: 24.05.2012
Сообщений: 90
20.04.2014, 18:05     Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? #1
Добрый день. Не могу найти информацию по двум вопросам :
1) могу ли я разместить переменную в нужную ячейку памяти. Например:
C++
1
2
int a ;
&a = ABF068;
2) И реально ли вообще хранить например тот же тип int, но не в 4 последовательных байтах, а разбросать по памяти?

p.s. Я прекрасно понимаю, что в памяти хранится не только мои переменные, но и важные данные для работы операционной системы и скорее всего стоит защита от таких вот "хацкеров" как я, что бы они не угробили систему. Но все же реально ли это (опять же знаю, что все реально, но может кто знает способ. Может в какой то ОС есть такой доступ).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2014, 18:05     Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти?
Посмотрите здесь:

C++ выделение памяти под переменную
Cколько элементов типа int можно хранить в локальной памяти? C++
C++ Как найти переменную в памяти?
Выделение памяти под переменную в структуре C++
C++ Запись переменной в определенную ячейку памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ProNoooob
71 / 71 / 6
Регистрация: 14.10.2009
Сообщений: 121
20.04.2014, 19:26     Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? #2
1) Это сложный вопрос.
Во первых нужно понимать, что в Windows используется механизм виртуальной памяти.
Таким образом, когда ты сохраняешь данные по определенному адресу, ОС сохраняет их в реальной памяти по другому(реальному адресу) или на диске.

Второй момент состоит в том, что процесс(программа) может читать и записывать только в память, выделенную ОС специально для нее. Тут конечно есть куча обходных моментов. Самый простой - использование функций WriteProcessMemory(), которая позволяет писать в память чужой программы.

2) Да, конечно. Правда и собирать это число придется так-же по кусочкам ^_^
Jariel
 Аватар для Jariel
2 / 2 / 0
Регистрация: 24.05.2012
Сообщений: 90
20.04.2014, 19:30  [ТС]     Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? #3
2) ну я так понимаю, что это будет возможно только в том случае если найдем решение на первый вопрос?
1) а есть информация как с этим дела в Linux или Os X ?
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
20.04.2014, 19:39     Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? #4
Jariel, ассемблер тебе в помощь =)
ProNoooob
71 / 71 / 6
Регистрация: 14.10.2009
Сообщений: 121
20.04.2014, 19:47     Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? #5
ну я так понимаю, что это будет возможно только в том случае если найдем решение на первый вопрос?
Хмм. На сколько я знаю, такая задача решается написанием драйвера уровня ядра.
Но не думаю, что этот вариант для вас.

Цитата Сообщение от Jariel Посмотреть сообщение
а есть информация как с этим дела в Linux или Os X ?
На сколько я знаю так-же.
Механизм виртуальной памяти решает 2 проблемы:
1) Позволяет использовать механизм своппинга. Это было очень актуально несколько лет назад.
2) Ограничивает доступ к не своей памяти. Это очень важно. Иначе бы программы портили бы память друг друга и ничего бы не работало.

Просто скажите какую проблему вы решаете?
часто, можно найти более простое решение.
Jariel
 Аватар для Jariel
2 / 2 / 0
Регистрация: 24.05.2012
Сообщений: 90
20.04.2014, 19:57  [ТС]     Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? #6
Никакой не решаю. я всю учебную жизнь писал на C#, а тут приехал на семестр в Китай и кроме Си и С++ ничего нет. Вот начал изучать. Работаем с микроконтроллерами и для их работы очень полезно понимать как работает память. Думаю как раз в контроллерах более прямой доступ к памяти. Но я вот изучаю и мне стало интересно, мог ли я сам решать куда писать. Вы мне достаточно подробно объяснили ситуацию. Спасибо за это
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.04.2014, 00:50     Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? #7
Цитата Сообщение от Jariel Посмотреть сообщение
могу ли я разместить переменную в нужную ячейку памяти
как уже ответили - в конкретную нельзя, но в косвенную можно
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main() {
    char buf[sizeof(int)];
    int* ptr = new (buf) int(42);
    std::cout << static_cast<const void*>(buf) << '\n' << ptr << '\n' << *ptr;
    return 0;
}
это называется placement new
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2014, 01:05     Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти?
Еще ссылки по теме:

C++ Как обнулить указатель на одну ячейку в динамически-выделенной памяти?
Возможно ли драйвером контроллера памяти реально изменить принцип работы с самой железкой? C++
C++ Где хранить размер блока памяти?

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
21.04.2014, 01:05     Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? #8
Цитата Сообщение от Jariel Посмотреть сообщение
1) могу ли я разместить переменную в нужную ячейку памяти. Например:
C++
1
2
int a ;
&a = ABF068;
так нет
для начала ты не шестнадцатеричное число написал а метку
а вот так можешь
C++
1
2
int * a=0xABF068 ;
*a =100;
по адресу ABF068 запишется число 100
ктати вполне штатная ситуация во времена ДОС или при работе с микроконтроллерами или програмирование на низком уровне,например БИОС пишешь, когда имеешь доступ ко всей памяти
а на современных ОС скорее всего выскочит исключение "неправомерный доступ"

Добавлено через 54 секунды
Цитата Сообщение от Jupiter Посмотреть сообщение
как уже ответили - в конкретную нельзя,
почему это?
мир состоит не только из Виндос и Линукс

Добавлено через 3 минуты
добавлю
можешь и на виндос если будешь писать прогу для работы в 0 кольце, но ответственность за крах системы берешь на себя
Yandex
Объявления
21.04.2014, 01:05     Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти?
Ответ Создать тему
Опции темы

Текущее время: 06:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru