Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2015, 13:40   #1
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Здравствуйте!
Инициализировал переменные различных типов а и b. Нашел их адреса через &a и &b
Подскажите как найти разность адресов, то есть смещение адреса переменной b относительно адреса переменной а

Самый простой и с виду действующий способ выдает неверные данные

Код:
int n,a;
char b;

a=10
b=0xff;

n=(int)&a-(int)&b;

printf("%i", n);

Последний раз редактировалось Stilet; 05.03.2015 в 16:45.
Ka2R вне форума Ответить с цитированием
Старый 05.03.2015, 14:51   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,609
По умолчанию

Смещение в каких единицах?
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 05.03.2015, 14:56   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Зачем адреса приводить к интам? Для вывод адресо у принтфа есть спец.формат. Что вы подразумеваете под неверными данными?
p51x вне форума Ответить с цитированием
Старый 05.03.2015, 15:01   #4
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Цитата:
Сообщение от challengerr Посмотреть сообщение
Смещение в каких единицах?
В единицах памяти - байтах.

Цитата:
Зачем адреса приводить к интам? Для вывод адресо у принтфа есть спец.формат. Что вы подразумеваете под неверными данными?
Задача на примере разности адресов переменных, наглядно показать сколько памяти выделяется под каждый тип переменной.

То есть, например, смещение адреса переменной char от int должен быть 1 байт и т.д.

Без приведения к интам адресов, разность не найти обычным вычитанием. Если есть другой способ вычесть адреса друг из друга, то прошу как раз посвятить

Последний раз редактировалось Ka2R; 05.03.2015 в 15:10.
Ka2R вне форума Ответить с цитированием
Старый 05.03.2015, 15:23   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
Без приведения к интам адресов, разность не найти обычным вычитанием
О как. А куча программистов пользуется адресной арифметикой в С/С++ и не знают, что, по вашему, ее не существует.
p51x вне форума Ответить с цитированием
Старый 05.03.2015, 15:32   #6
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
О как. А куча программистов пользуется адресной арифметикой в С/С++ и не знают, что, по вашему, ее не существует.
Показал превосходство над новичком - ОТЕЦ!
Ka2R вне форума Ответить с цитированием
Старый 05.03.2015, 16:48   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Без приведения к интам адресов, разность не найти обычным вычитанием.
Т.е n=a-b не дает нужного результата? О_о
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.03.2015, 17:05   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,089
По умолчанию

sizeof чем не устраивает? Как разность адресов покажет разницу в выделенной памяти?
pu4koff вне форума Ответить с цитированием
Старый 05.03.2015, 19:27   #9
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Может быть я криво объясняю. Давайте на полном примере

Код:
#include <stdio.h>
 
char b=0xff;
int a=0xffffffff;
 
 
int main(void) {
	printf("%p %p,&b,&a);
	return 0;
}
Вот что на выходе
0x8049754 0x8049750

Вопрос. Как мне отнять от одного адреса другой?
Ka2R вне форума Ответить с цитированием
Старый 05.03.2015, 20:33   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вот что на выходе
0x8049754 0x8049750
Не исключено что здесь сработали какие-то настройки компилятора по выравниванию переменных. Отсюда и 4 байта - 32-битка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Смещение pastuhdima Помощь студентам 0 19.11.2011 00:37
Смещение Зод Win Api 1 26.08.2011 13:40
Смещение компонента Volt Общие вопросы Delphi 9 20.01.2010 00:36
Смещение ячеек Zulius Microsoft Office Excel 3 26.11.2009 12:30
Смещение в WinHex bmw Софт 4 22.03.2009 02:16