Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
FarStar
Заблокирован
#1

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

02.06.2011, 09:04. Просмотров 1544. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Где в памяти храняться данные моего приложения? (C++):

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

API для моего приложения - C++
Этап 1. Я пишу приложение для windows, оно делает какую-то работу, что-то считает и т.п. У него в результате этой работы появляются...

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

В строковом массиве храняться фамилии и инициалы учеников класса. - C++
В строковом массиве храняться фамилии и инициалы учеников класса.Требуется напечатать список класса с указанием для каждого ученика...

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

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

35
pito211
186 / 173 / 8
Регистрация: 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 / 8
Регистрация: 22.03.2010
Сообщений: 612
02.06.2011, 09:43 #4
в один из сегментов данных. Адресс "блока" можно получить операторм &
1
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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
3570 / 1753 / 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;
Но при повторном запуске врядли можно гарантировать размещение по тому же адресу.
1
FarStar
Заблокирован
02.06.2011, 10:01  [ТС] #8
Цитата Сообщение от taras atavin Посмотреть сообщение
Переменным в любом случае присваиваются только двоичные значения, в твоём случае 00000000000000000000000011001000, всё остальное подлежит автоматическому переводу, так что разницы нет.
Спасибо! теперь понял! Тоесть я могу и в HEX и в DEC и в OCT и в BIN присваивать значения переменным! отлично! ;-))
0
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 что - типа ЭКСЭС ДИНАЙТ?
используй разделяемую память хотя б.

разные приложения работают в разных виртуальных адресных пространствах
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.06.2011, 10:04 #10
Цитата Сообщение от FarStar Посмотреть сообщение
уть в следующем: хочу ради эксперимента в одном приложение создать DWORD data, а в другом приложение обратиться к блоку памяти с этой переменной и прочитать его, это же возможно?
Если ты не позаботеился об этом в первом приложении, то нет. Существуют физические и виртуальынек адреса, любое приложние работает только с виртуальными адресами, причём, у каждого собственное вирутальное адресное пространство, чужая паямть туда вообще не отображается. В принципе существует так называемая глобальная память, отображаемая сразу на несколько адресных пространств, но размещать данные в глобальной памяти должно приложние-источник. Под какую систему пишешь? Разбирайся с соотвествующими спецификациями средств обмена данными между приложениями.
1
FarStar
Заблокирован
02.06.2011, 10:07  [ТС] #11
Да это всё под WindowsXP на процессоре Intel
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.06.2011, 10:08 #12
Тогда читай DDE.
1
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 роется в чужих адресных пространствах?
1
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 -> вот тут мы разыменовываем этот адресс, т.е. берем значение по этому адресу*/
1
FarStar
Заблокирован
02.06.2011, 10:12  [ТС] #15
Да это всё под WinXP и под Intel X86.
Ну что оператор & как бы берёт адрес переменной я понял, а оператор * что делает?
К примеру: IDirectInput8 *DI;
И что всё таки означает приставка "LP" в LPDIRECTINPUT8 ?
0
02.06.2011, 10:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2011, 10:12
Привет! Вот еще темы с ответами:

Запуск .NET C# программы из памяти C++ приложения - C++
Понадобилось реализовать запуск .NET C# программы прямо из памяти C++ приложения. Использую функцию: BOOL ExecFile(LPWSTR szFilePath,...

Где в памяти хранится тип указателя? - C++
Привет! Вы не подскажите, где в памяти храниться тип указателя? Ну допустим, у нас x86 и указатель занимает 4 байта, но эти 4-е байта -...

Где хранить размер блока памяти? - C++
Пишу менеджер памяти. Храню размер в первых 4x байтах выделенной памяти. В коде все вызовы new заменяю на следующее: //Iterator...

Данные по адресу памяти - C++
У меня есть адрес например 0x11E9B62C как узнать что по нему записанно?


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

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

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