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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2012, 17:51   #1
Taler
Новичок
Джуниор
 
Регистрация: 03.04.2012
Сообщений: 3
По умолчанию Странное выполнение кода.

Я только начал изучение программирования, поэтому представленный внизу код - это просто эксперимент для лучшего понимания процессов.
Цитата:
Код:
#include <iostream>
#include <clocale>  // поддержка русского языка
#include <conio.h> //_getch

using namespace std;

int main()
{
	setlocale(LC_CTYPE,"Russian");
	while (1)
	{
		signed short int aa = 1;
		signed short int ab = 2;
		signed short int ac = 3;
		signed short int *a,*b,*c;
		
		a = &aa;
		b = &ab;
		c = &ac;
		
		cout << "Адрес a: " << a << '\n'
			<< "Адрес b: " << b << '\n'
			<< "Адрес c: " << c << '\n';
		
		_getch();
	}

	_getch();
	return 0;
}
При выполнении этого кода на экране появляются вот такие строки:

Цитата:
Адрес а: 0012FF60
Адрес b: 0012FF54
Адрес c: 0012FF48
В связи с этим у меня появилось сразу же два вопроса:
1. По идее на экран должны выводится адреса переменных aa,ab и ac. На первый взгляд это и происходит. Но дело в том, что адреса выводятся всё время одни и тежи, сколько бы раз не запускалась программа. Так ведь не может быть, чтоба Операционная Система всегда размещала переменные точно в одном и том же масте. Я даже пробовал специально занимать много памяти другими программами, чтобы эти адреса точно были заняты, но результат не меняется. В чём тут дело? Поясните кто понимает.
2.В коде все три переменные объявлены как signed short int. Значит под них должно быть выделено по два байта (16 бит). А в консоле мы видим, что для первой переменной (а) выделено 4 байта, а для второй (b) вообще 6 байт. Почему?
Taler вне форума Ответить с цитированием
Старый 03.04.2012, 18:30   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

1) У каждого приложения свое виртуальное адресное пространство.
И если в коде изменений нет, то почему бы переменным не занимать те же адреса.

2)
Длина типа signed short int - действительно два байта.
Но почему Вы решили что разброс адресов у двух подряд объявленных переменных должен в точности равнятся длине типа первой переменной?
Вот если бы вы увидели что разница в адресах меньше длины типа, тогда был бы повод задуматься.

Последний раз редактировалось EUGY; 03.04.2012 в 18:34. Причина: )
EUGY вне форума Ответить с цитированием
Старый 03.04.2012, 18:31   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

2. Адреса написаны в шестнадцатиричной системе, разница между ними по 12 байт. У меня тот же код выделяет по два байта. Откуда разница - понятия не имею)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 03.04.2012, 18:43   #4
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Да, как уже и сказал EUGY у каждого приложения своё адресное пространство. Проверяется это достаточно простым запуском одного и того же приложения дважды. Адреса будут одинаковы. По видимому вы пользуетесь Visual Studio. Попробуйте посмотреть, что вернёт вам ф-я sizeof(signed short int). У каждого компилятора своё мнение по поводу количества места занимаемого переменной определённого типа в оперативной памяти.
Возможно Я Быдлокодер ©.

Последний раз редактировалось t2skler; 03.04.2012 в 18:47.
t2skler вне форума Ответить с цитированием
Старый 03.04.2012, 19:00   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Есть подозрение, что в 32-разрядной системе даже char будет занимать 4 байта. Гарантировано стандартом только то, что размер short по меньшей мере составляет 2 байта, максимальный размер стандартом не ограничен.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 03.04.2012, 19:22   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Гром, у автора сомнение, почему у него тип занимает два байта sizeof(short)==2
А адрес следующей переменной отличается от адреса первой больше чем на два байта. Как будто объявленные подряд переменные должны быть упакованой структурой.
EUGY вне форума Ответить с цитированием
Старый 03.04.2012, 20:03   #7
Taler
Новичок
Джуниор
 
Регистрация: 03.04.2012
Сообщений: 3
По умолчанию

Попробовал создать массив из переменных и вывести их. В этом случае всё выводится правильно - если short, то 2 байта; если long, то 4 байта. Действительно, отдельные переменные, в отличие от массивов или структур, не обязаны стоять строго друг за другом. Это я как-то забыл. Потом сам сообразил. Однако, не понятно, почему мой компилятор ставит их так далеко друг от друга - аж 12 байт, а компилятор Granus'а: http://programmersforum.ru/showpost....56&postcount=3
чётко друг за другом. Я действительно пользуюсь Visual Studio. Видимо это особенности компилятора?

Если я правильно понял, то виртуальное адресное пространство - это, как бы, "метка", которую ставит компилятор, и отсчитывает от неё размещение данных всего кода. И эта метка не имеет прямого отношения к реальным ячейкам памяти.
Taler вне форума Ответить с цитированием
Старый 03.04.2012, 20:10   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ТС, в виртуальное адресное пространство вы вообще зря полезли.
а тот эффект что вы видите называеться "выравнивание данных".

ответы:
1)так код то один и тот же, почему должно чтото меняться?
точка входа та же самая, вершина стека там же, ничего по сути и не меняеться между запусками.
Цитата:
Есть подозрение, что в 32-разрядной системе даже char будет занимать 4 байта. Гарантировано стандартом только то, что размер short по меньшей мере составляет 2 байта, максимальный размер стандартом не ограничен.
нет, размер строго стандартизирован.
а вот выравнивание данных не ограничено.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.04.2012, 20:19   #9
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Видимо это особенности компилятора?
Да, причем на одном компиляторе в debug и release могут быть разные результаты.

ЗЫ. Не думаю, что это объясняется выравниванием.

Последний раз редактировалось EUGY; 03.04.2012 в 20:27.
EUGY вне форума Ответить с цитированием
Старый 03.04.2012, 23:54   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
ЗЫ. Не думаю, что это объясняется выравниванием.
иных мыслей у меня нет.
скиньте код на котором есть эффект, и компилятор на котором он есть(в том числе параметры компилирования)
я завтра проверю в дизасме почему так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение кода Access из Excel Konstantin1970 Microsoft Office Access 3 13.02.2012 12:02
Выполнение PHP кода Sprat PHP 1 31.01.2012 15:12
Парсер, выполнение кода. zumm Общие вопросы Delphi 27 30.06.2010 13:29
.htaccess запрет на выполнение кода wall66 PHP 3 11.08.2009 10:54
Выполнение кода из файла.. NSvirus Паскаль, Turbo Pascal, PascalABC.NET 25 14.06.2009 00:56