С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
FarStar
Заблокирован
1

Где в памяти храняться данные моего приложения?

02.06.2011, 09:04. Просмотров 1623. Ответов 35
Метки нет (Все метки)

Добрый день! Подскажите кто знает, у меня тут пара нубских вопросов:
1. Вот когда я создаю данные какого - нибуть типа, например DWORD data, я могу присвоить переменной data значение, к примеру, 200, а могу и C8 (это 200 в HEX). Так вот вопрос, С++ всё равно в какой системе исчисления и присваиваю значение переменной или всётаки нет ?

2. Создаю всю туже глобальную переменную DWORD data=200. Хотелось бы узнать, по какому адресу моё приложение загонит её в оперативную память? Ну если так подумать, DWORD - это ж дабл ворд, тоесть 32-х разрядная переменная, тоесть в ней два WORD и 4 BYTE, правильно? Тоесть создавая переменную DOWRD data=200, грубо говоря добавляются не значимые нули слева для соответствия разрядности, короче говоря, в какой блок памяти все эти 32 бита заносятся. Суть в следующем: хочу ради эксперимента в одном приложение создать DWORD data, а в другом приложение обратиться к блоку памяти с этой переменной и прочитать его, это же возможно? Или мне напишут в Windows что - типа ЭКСЭС ДИНАЙТ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2011, 09:04
Ответы с готовыми решениями:

С-строки. Где храняться? Когда удаляются?
есть, к примеру, такой класс class Hero { private: char * name; ...

API для моего приложения
Этап 1. Я пишу приложение для windows, оно делает какую-то работу, что-то...

Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти?
Добрый день. Не могу найти информацию по двум вопросам : 1) могу ли я...

В строковом массиве храняться фамилии и инициалы учеников класса.
В строковом массиве храняться фамилии и инициалы учеников класса.Требуется...

Массив: Найти произведение двух верхнеугольных матриц, которые храняться в упакованном виде в одномерных массивах.
Найти произведение двух верхнеугольных матриц,которые храняться в упакованном...

35
pito211
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
02.06.2011, 09:17 2
SIGSEGV наверно
1
FarStar
Заблокирован
02.06.2011, 09:22  [ТС] 3
Ладно, а если я хочу прочитать не из другого приложения, а из этого же, но не буду смотреть на то, что у меня явно есть эти данные DWORD data, а попробую обратиться к блоку памяти для чтения этих данных, например, к какому нибуть блоку типа 0xFFFAD (в общем на низком уровне). К КАКОМУ БЛОКУ ОБРАЩАТЬСЯ? Куда переменные суются статические?
0
pito211
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
02.06.2011, 09:43 4
в один из сегментов данных. Адресс "блока" можно получить операторм &
1
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
02.06.2011, 09:58 5
Цитата Сообщение от FarStar Посмотреть сообщение
1. Вот когда я создаю данные какого - нибуть типа, например DWORD data, я могу присвоить переменной data значение, к примеру, 200, а могу и C8 (это 200 в HEX). Так вот вопрос, С++ всё равно в какой системе исчисления и присваиваю значение переменной или всётаки нет ?
Переменным в любом случае присваиваются только двоичные значения, в твоём случае 00000000000000000000000011001000, всё остальное подлежит автоматическому переводу, так что разницы нет.
1
FarStar
Заблокирован
02.06.2011, 09:58  [ТС] 6
Слушай, я самоучка и у меня есть какие - то базовые пробелы в знаниях походу дела....
Можешь мне помочь в этой же теме:
1. Вот чем отличается создание указателя на интерфейс,к примеру, на директ Х - см ниже
а) LPDIRECTINPUT8 di; PS. на счёт точности названия не уверен.
б) LPDIRECTINPUT8 *di;
2. что означает приставка "LP" в данном случае? Это ж какой - то хороший тон программирования или что?
3. Вот оператор &, про который ты написал, что может означать опять же в данном случае, к примеру:
a) LPDIRECTINPUT8 di; создал без звёздочки
InitDI(&di); нужен оператор (если функция со звёздочкой)
б) LPDIRECTINPUT8 *di; создал со звёздочкой
InitDI(di); уже не нужен оператор &.

Тоесть для чего звёздочка и & оператор?
0
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
02.06.2011, 10:00 7
Цитата Сообщение от FarStar Посмотреть сообщение
2. Создаю всю туже глобальную переменную DWORD data=200. Хотелось бы узнать, по какому адресу моё приложение загонит её в оперативную память?
C++
1
2
DWORD *p=&data;
std::cout<<p;
Но при повторном запуске врядли можно гарантировать размещение по тому же адресу.
1
FarStar
Заблокирован
02.06.2011, 10:01  [ТС] 8
Цитата Сообщение от taras atavin Посмотреть сообщение
Переменным в любом случае присваиваются только двоичные значения, в твоём случае 00000000000000000000000011001000, всё остальное подлежит автоматическому переводу, так что разницы нет.
Спасибо! теперь понял! Тоесть я могу и в HEX и в DEC и в OCT и в BIN присваивать значения переменным! отлично! ;-))
0
denix
63 / 63 / 5
Регистрация: 11.01.2009
Сообщений: 130
02.06.2011, 10:02 9
Цитата Сообщение от FarStar Посмотреть сообщение
Добрый день! Подскажите кто знает, у меня тут пара нубских вопросов:
1. Вот когда я создаю данные какого - нибуть типа, например DWORD data, я могу присвоить переменной data значение, к примеру, 200, а могу и C8 (это 200 в HEX). Так вот вопрос, С++ всё равно в какой системе исчисления и присваиваю значение переменной или всётаки нет ?
все равно.

Цитата Сообщение от FarStar Посмотреть сообщение
2. Создаю всю туже глобальную переменную DWORD data=200. Хотелось бы узнать, по какому адресу моё приложение загонит её в оперативную память?
зависит от систему, от ld. смотри сегмен .data, если ты ее проинициализировал при объявлении.

Цитата Сообщение от FarStar Посмотреть сообщение
Ну если так подумать, DWORD - это ж дабл ворд, тоесть 32-х разрядная переменная, тоесть в ней два WORD и 4 BYTE, правильно?
от процессора зависит, кури маны на проц, скольки байтам у проца равно машинное слово.

Цитата Сообщение от FarStar Посмотреть сообщение
Суть в следующем: хочу ради эксперимента в одном приложение создать DWORD data, а в другом приложение обратиться к блоку памяти с этой переменной и прочитать его, это же возможно? Или мне напишут в Windows что - типа ЭКСЭС ДИНАЙТ?
используй разделяемую память хотя б.

разные приложения работают в разных виртуальных адресных пространствах
0
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
02.06.2011, 10:04 10
Цитата Сообщение от FarStar Посмотреть сообщение
уть в следующем: хочу ради эксперимента в одном приложение создать DWORD data, а в другом приложение обратиться к блоку памяти с этой переменной и прочитать его, это же возможно?
Если ты не позаботеился об этом в первом приложении, то нет. Существуют физические и виртуальынек адреса, любое приложние работает только с виртуальными адресами, причём, у каждого собственное вирутальное адресное пространство, чужая паямть туда вообще не отображается. В принципе существует так называемая глобальная память, отображаемая сразу на несколько адресных пространств, но размещать данные в глобальной памяти должно приложние-источник. Под какую систему пишешь? Разбирайся с соотвествующими спецификациями средств обмена данными между приложениями.
1
FarStar
Заблокирован
02.06.2011, 10:07  [ТС] 11
Да это всё под WindowsXP на процессоре Intel
0
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
02.06.2011, 10:08 12
Тогда читай DDE.
1
pito211
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
02.06.2011, 10:11 13
Цитата Сообщение от FarStar Посмотреть сообщение
Тоесть для чего звёздочка и & оператор?
& это ссылка на объект, её можно воспринимать как константный указатель
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int i = 24754;
011115AE  mov         dword ptr [i],60B2h 
    int &p = i;
011115B5  lea         eax,[i] 
011115B8  mov         dword ptr [p],eax 
    int *const pp = &i;
011115BB  lea         eax,[i] 
011115BE  mov         dword ptr [pp],eax 
    p = 1526;
011115C1  mov         eax,dword ptr [p] 
011115C4  mov         dword ptr [eax],5F6h 
    *pp = 385;
011115CA  mov         eax,dword ptr [pp] 
011115CD  mov         dword ptr [eax],181h
Добавлено через 2 минуты
интересно как ArtMoney роется в чужих адресных пространствах?
1
denix
63 / 63 / 5
Регистрация: 11.01.2009
Сообщений: 130
02.06.2011, 10:11 14
Цитата Сообщение от FarStar Посмотреть сообщение
Слушай, я самоучка и у меня есть какие - то базовые пробелы в знаниях походу дела....
Можешь мне помочь в этой же теме:
1. Вот чем отличается создание указателя на интерфейс,к примеру, на директ Х - см ниже
а) LPDIRECTINPUT8 di; PS. на счёт точности названия не уверен.
б) LPDIRECTINPUT8 *di;
2. что означает приставка "LP" в данном случае? Это ж какой - то хороший тон программирования или что?
3. Вот оператор &, про который ты написал, что может означать опять же в данном случае, к примеру:
a) LPDIRECTINPUT8 di; создал без звёздочки
InitDI(&di); нужен оператор (если функция со звёздочкой)
б) LPDIRECTINPUT8 *di; создал со звёздочкой
InitDI(di); уже не нужен оператор &.

Тоесть для чего звёздочка и & оператор?

следует отличать оператор * при объявлении переменных и при разыменовании указателя.

int* ptr; /* bcgjkmpetv * при объявлении указателя*/
int data=0x777;

ptr=&data; /* берем адрес data и присваеваем адресс указателю*/

printf("ptr is %p\nptr->%d\n",ptr,*ptr); /*смотрим чему равно значение указателя(куда он указывает, т.е. там храниться адресс); *ptr -> вот тут мы разыменовываем этот адресс, т.е. берем значение по этому адресу*/
1
FarStar
Заблокирован
02.06.2011, 10:12  [ТС] 15
Да это всё под WinXP и под Intel X86.
Ну что оператор & как бы берёт адрес переменной я понял, а оператор * что делает?
К примеру: IDirectInput8 *DI;
И что всё таки означает приставка "LP" в LPDIRECTINPUT8 ?
0
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
02.06.2011, 10:13 16
C++
1
&
перед уже объявленной переменной - её адрес, исспользуется для присвивания его указаетлю или передаче в параметр функции, имеющий указательный тип, а в декларации - ссылка, то есть особый вид указаетля, для доступа к данным по которому достаточно имени указателя без дополнительных символов, а доступ к членам по нему осуществляется по точечной нотации, а не с помощью
C++
1
->
.
C++
1
*
перед именем уже объявленной перемнной указательного типа используется для дсотупа к данным по этому указателю, а в декларации - чтоб объявить указатель.
1
FarStar
Заблокирован
02.06.2011, 10:27  [ТС] 17
Так, правильно ли я понял, если есть у меня функция:
void Test(LPDIRECTINPUT8 *di, DWORD data)
{
di-> мне здес нужен, что я мог с интерфейсом директ инпута работать внутри функции
а, "data" нужен для того, чтоб я мог, к примеру, конкретное число какое - то передать интерфейсу di
}
?

И всё же, что такое "LP" в LPDIRECTINPUT ? Подозреваю, что это сокращение от какого нибуть LowPath, но что это значит?

И ещё детский вопрос, зачастую в структурах, первое поле - это размер самой структуры,
который при инициализации объявляется обычно как sizeof(сама структура),
но зачем этой структуре каждый раз надо указывать размер самой себя при инициализации?
Он же указывается до присвоения значений другим полям структуры, тоесть получается это размер пустой структуры - но он же одинаковый всегда.....
0
denix
63 / 63 / 5
Регистрация: 11.01.2009
Сообщений: 130
02.06.2011, 10:47 18
Цитата Сообщение от FarStar Посмотреть сообщение
И всё же, что такое "LP" в LPDIRECTINPUT ? Подозреваю, что это сокращение от какого нибуть LowPath, но что это значит?
этот тип скорее всего определен с использованием typedef

Цитата Сообщение от FarStar Посмотреть сообщение
И ещё детский вопрос, зачастую в структурах, первое поле - это размер самой структуры,
который при инициализации объявляется обычно как sizeof(сама структура)
впервые такое слышу
1
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
02.06.2011, 10:57 19
LP - уже указатель. c++ этого не понимает и если ты просто напишешь LPDWORD, то нифига не получится. Но типы с префиксом LP принято декларировать как указательные. Так что звёздочку в декларации указателя ставить уже не надо, иначе получишь указатель на указатель.
Цитата Сообщение от denix Посмотреть сообщение
впервые такое слышу
WNDCLASSEX тому пример.
1
FarStar
Заблокирован
02.06.2011, 10:59  [ТС] 20
Цитата Сообщение от denix Посмотреть сообщение
этот тип скорее всего определен с использованием typedef



впервые такое слышу
Я новичок, пардон за вопрос, чем отличается объявление со строкой typedef? Чем это круче ? ;-))
Что если я объявил интерфейс со строкой typedef мне обязательно в название ставит LP вначале названия? или это какое - то не гласное правило написание синтаксиса кода?


На счёт структуры - вот пример:
DIPROPRANGE diprg;
diprg.diph.dwSize = sizeof( DIPROPRANGE );
diprg.diph.dwHeaderSize = sizeof( DIPROPHEADER );
diprg.diph.dwHow = DIPH_BYID;
diprg.diph.dwObj = pdidoi->dwType; // Specify the enumerated axis
diprg.lMin = -65000;
diprg.lMax = +65000;

И ещё вопрос, что за извращённые переводы данных вот в этой функции:
if( FAILED( hr = DirectInput8Create( GetModuleHandle( NULL ), DIRECTINPUT_VERSION,
IID_IDirectInput8, ( VOID** )&g_pDI, NULL ) ) )
return hr;
Имеется ввиду вот это ( VOID** )&g_pDI - это как понимать? ;-))
0
02.06.2011, 10:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2011, 10:59

Запуск .NET C# программы из памяти C++ приложения
Понадобилось реализовать запуск .NET C# программы прямо из памяти C++...

Поиск адреса длл в памяти приложения
Это снова я! И снова проблема. Я пытался получить хендл загружаемой...

Используя класс list, в котором храняться фамилии студентов группы, организовать поиск по фамилии
Дали задание: используя класс list, в котором храняться фамилии студентов...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru