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

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

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

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

Данные по адресу памяти C++
C++ В строковом массиве храняться фамилии и инициалы учеников класса.
С-строки. Где храняться? Когда удаляются? C++
Массив: Найти произведение двух верхнеугольных матриц, которые храняться в упакованном виде в одномерных массивах. C++
Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
02.06.2011, 09:17     Где в памяти храняться данные моего приложения? #2
SIGSEGV наверно
FarStar
Заблокирован
02.06.2011, 09:22  [ТС]     Где в памяти храняться данные моего приложения? #3
Ладно, а если я хочу прочитать не из другого приложения, а из этого же, но не буду смотреть на то, что у меня явно есть эти данные DWORD data, а попробую обратиться к блоку памяти для чтения этих данных, например, к какому нибуть блоку типа 0xFFFAD (в общем на низком уровне). К КАКОМУ БЛОКУ ОБРАЩАТЬСЯ? Куда переменные суются статические?
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
02.06.2011, 09:43     Где в памяти храняться данные моего приложения? #4
в один из сегментов данных. Адресс "блока" можно получить операторм &
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.06.2011, 09:58     Где в памяти храняться данные моего приложения? #5
Цитата Сообщение от FarStar Посмотреть сообщение
1. Вот когда я создаю данные какого - нибуть типа, например DWORD data, я могу присвоить переменной data значение, к примеру, 200, а могу и C8 (это 200 в HEX). Так вот вопрос, С++ всё равно в какой системе исчисления и присваиваю значение переменной или всётаки нет ?
Переменным в любом случае присваиваются только двоичные значения, в твоём случае 00000000000000000000000011001000, всё остальное подлежит автоматическому переводу, так что разницы нет.
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); уже не нужен оператор &.

Тоесть для чего звёздочка и & оператор?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.06.2011, 10:00     Где в памяти храняться данные моего приложения? #7
Цитата Сообщение от FarStar Посмотреть сообщение
2. Создаю всю туже глобальную переменную DWORD data=200. Хотелось бы узнать, по какому адресу моё приложение загонит её в оперативную память?
C++
1
2
DWORD *p=&data;
std::cout<<p;
Но при повторном запуске врядли можно гарантировать размещение по тому же адресу.
FarStar
Заблокирован
02.06.2011, 10:01  [ТС]     Где в памяти храняться данные моего приложения? #8
Цитата Сообщение от taras atavin Посмотреть сообщение
Переменным в любом случае присваиваются только двоичные значения, в твоём случае 00000000000000000000000011001000, всё остальное подлежит автоматическому переводу, так что разницы нет.
Спасибо! теперь понял! Тоесть я могу и в HEX и в DEC и в OCT и в BIN присваивать значения переменным! отлично! ;-))
denix
 Аватар для denix
63 / 63 / 2
Регистрация: 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 что - типа ЭКСЭС ДИНАЙТ?
используй разделяемую память хотя б.

разные приложения работают в разных виртуальных адресных пространствах
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.06.2011, 10:04     Где в памяти храняться данные моего приложения? #10
Цитата Сообщение от FarStar Посмотреть сообщение
уть в следующем: хочу ради эксперимента в одном приложение создать DWORD data, а в другом приложение обратиться к блоку памяти с этой переменной и прочитать его, это же возможно?
Если ты не позаботеился об этом в первом приложении, то нет. Существуют физические и виртуальынек адреса, любое приложние работает только с виртуальными адресами, причём, у каждого собственное вирутальное адресное пространство, чужая паямть туда вообще не отображается. В принципе существует так называемая глобальная память, отображаемая сразу на несколько адресных пространств, но размещать данные в глобальной памяти должно приложние-источник. Под какую систему пишешь? Разбирайся с соотвествующими спецификациями средств обмена данными между приложениями.
FarStar
Заблокирован
02.06.2011, 10:07  [ТС]     Где в памяти храняться данные моего приложения? #11
Да это всё под WindowsXP на процессоре Intel
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.06.2011, 10:08     Где в памяти храняться данные моего приложения? #12
Тогда читай DDE.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 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 роется в чужих адресных пространствах?
denix
 Аватар для denix
63 / 63 / 2
Регистрация: 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 -> вот тут мы разыменовываем этот адресс, т.е. берем значение по этому адресу*/
FarStar
Заблокирован
02.06.2011, 10:12  [ТС]     Где в памяти храняться данные моего приложения? #15
Да это всё под WinXP и под Intel X86.
Ну что оператор & как бы берёт адрес переменной я понял, а оператор * что делает?
К примеру: IDirectInput8 *DI;
И что всё таки означает приставка "LP" в LPDIRECTINPUT8 ?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.06.2011, 10:13     Где в памяти храняться данные моего приложения? #16
C++
1
&
перед уже объявленной переменной - её адрес, исспользуется для присвивания его указаетлю или передаче в параметр функции, имеющий указательный тип, а в декларации - ссылка, то есть особый вид указаетля, для доступа к данным по которому достаточно имени указателя без дополнительных символов, а доступ к членам по нему осуществляется по точечной нотации, а не с помощью
C++
1
->
.
C++
1
*
перед именем уже объявленной перемнной указательного типа используется для дсотупа к данным по этому указателю, а в декларации - чтоб объявить указатель.
FarStar
Заблокирован
02.06.2011, 10:27  [ТС]     Где в памяти храняться данные моего приложения? #17
Так, правильно ли я понял, если есть у меня функция:
void Test(LPDIRECTINPUT8 *di, DWORD data)
{
di-> мне здес нужен, что я мог с интерфейсом директ инпута работать внутри функции
а, "data" нужен для того, чтоб я мог, к примеру, конкретное число какое - то передать интерфейсу di
}
?

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

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

Цитата Сообщение от FarStar Посмотреть сообщение
И ещё детский вопрос, зачастую в структурах, первое поле - это размер самой структуры,
который при инициализации объявляется обычно как sizeof(сама структура)
впервые такое слышу
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.06.2011, 10:57     Где в памяти храняться данные моего приложения? #19
LP - уже указатель. c++ этого не понимает и если ты просто напишешь LPDWORD, то нифига не получится. Но типы с префиксом LP принято декларировать как указательные. Так что звёздочку в декларации указателя ставить уже не надо, иначе получишь указатель на указатель.
Цитата Сообщение от denix Посмотреть сообщение
впервые такое слышу
WNDCLASSEX тому пример.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2011, 10:59     Где в памяти храняться данные моего приложения?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
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 - это как понимать? ;-))
Yandex
Объявления
02.06.2011, 10:59     Где в памяти храняться данные моего приложения?
Ответ Создать тему
Опции темы

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