Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/47: Рейтинг темы: голосов - 47, средняя оценка - 4.87
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415

Расположение переменных в памяти

09.03.2017, 17:28. Показов 9563. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Было в Эккеле вот такое вот упражнение :
"Определить подряд два массива типа int. Сместить индекс от конца первого массива в начало второго и выполнить присваивание. Проверить, изменилось ли содержание второго массива".
Так вот, когда я пытался сместить индекс от конца первого массива, ничего не получалось.
Пришла мысль вывести адреса массивов. Каким-то образом, адрес указателя на первый массив лежал прямо за моим ВТОРЫМ массивом. Причем я перезапускал несколько раз, всегда одно и тоже.
И я решил смещать указатель на второй массив, заполняя им первый. Удивительно, но все получилось.
В Qt Creator этот зверь работает именно так как надо, без падений.
В Visual Studio 15 падает с повреждением стека. Но и там сначала лежит второй массив, затем первый. И частично код там отрабатывает, падает в самом конце,после вывода - на выходе из мейн.
Как это понимать? И почему вообще получается так, что переменная объявленная "позже" лежит в памяти "раньше"?
Причем массивы здесь вроде бы статические. То есть, не VLA-массивы, про которые я немного почитал.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
 
void printa(int *array, const size_t &CAPACITY);
int main()
{
  constexpr size_t CAPACITY = 100;
  int first_array[CAPACITY];
  int second_array[CAPACITY];
 
  size_t detector = 0 ;
  for (size_t counter = CAPACITY; detector < CAPACITY;detector++, counter++)
    {
      *(second_array+counter) = counter;
    }
  printa(first_array, CAPACITY);
  std :: cout << std :: endl << (long)&first_array << std :: endl;
  std :: cout << (long)&second_array << std :: endl;
}
 
 
void printa(int *array, const size_t &CAPACITY)
{
  for (size_t counter = 0 ; counter < CAPACITY; counter++)
    {
      std :: cout << array[counter] << '\t';
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.03.2017, 17:28
Ответы с готовыми решениями:

Расположение переменных в памяти
int x; int y; int f; cout&lt;&lt;&amp;x&lt;&lt;' '&lt;&lt;&amp;f; f идет после x(x-&gt;f) int x; int y; int f;

Целые числа и расположение их в памяти
Наткнулся тут на один интересный момент. Допустим у нас есть переменная - слово (WORD), равная, например, 45221. Всегда считал, что числа...

Расположение полей структуры в памяти
Нифига себе на что плюсы способны... #include &quot;stdafx.h&quot; #include &lt;time.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; using...

27
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
09.03.2017, 21:52  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от nd2 Посмотреть сообщение
как делал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
 
#define PRINT(STR,VARIABLE) std :: cout << STR << (long)&VARIABLE << std :: endl;
 
int global_value;
static int static_global_value;
extern int extern_variable;
 
void look_at_static();
void look_at_the_second_function_address();
int main()
{
    int local_variable;
    static int local_static_variable;
    int extern_variable;
    register int register_variable;
 
    PRINT("The address of the function is : ", look_at_static);
    PRINT("The address of the second function is : ", look_at_the_second_function_address);
    PRINT("The address of the local main's variable is : ", local_variable);
    PRINT("The address of the global value is : ", global_value);
    PRINT("The address of the local main's static variable is : ", local_static_variable);
    look_at_static();
    look_at_the_second_function_address();
    PRINT("The address of the global static value is : ", static_global_value);
    PRINT("The address of the variable which was determined as the extern : ", extern_variable);
    PRINT("The adress of the register value is : ", register_variable);
}
 
void look_at_static()
{
    static int function_static_variable;
    int function_local_variable;
 
    PRINT("The address of the static variable from the first function is : ", function_static_variable);
    PRINT("The address of the function's local variable is : ", function_local_variable);
}
 
void look_at_the_second_function_address()
{
    static int second_function_static_variable;
    PRINT("The address of the static variable from the second function is ", second_function_static_variable);
}
Cейчас проверил на VS "лежат" куда ближе, уже видно,что в одной области. До этого пробовал на стареньком G++, там было так, как описывал выше.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
09.03.2017, 22:24
Цитата Сообщение от Notoriously Посмотреть сообщение
C++
1
(long)&VARIABLE
mingw, у меня, такое не принимает.
C++
1
(void*)&VARIABLE
Добавлено через 8 минут
Цитата Сообщение от Notoriously Посмотреть сообщение
Адрес функции "лежал" по адресу, допустим 73000, в то время как адреса статических и глобальных переменных начинались с 400х тысяч.
В любом случае, к языку это уже отношения не имеет. Как и где выделяется память физически - это уже имеет отношение к компиляторам, ОС и т.п.
1
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
09.03.2017, 22:44  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Как и где выделяется память физически - это уже имеет отношение к компиляторам, ОС
Понял. Не устаю удивляться тому, как много стандарт отпускает на откуп компиляторам и системе.
И я правильно понимаю,что даже области памяти (статическая, стек и куча) стандартом не детерминированы?
И нельзя быть уверенным, что при всякой реализации моя глобальная переменная будет обитать в статической памяти?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
09.03.2017, 23:53
Цитата Сообщение от Notoriously Посмотреть сообщение
И я правильно понимаю,что даже области памяти (статическая, стек и куча) стандартом не детерминированы?
Я стандарт плохо знаю, почитай там раздел: "Storage duration".
Цитата Сообщение от Notoriously Посмотреть сообщение
И нельзя быть уверенным, что при всякой реализации моя глобальная переменная будет обитать в статической памяти?
Можно быть уверенным. По каким физическим (или виртуальным) адресам эта память будет расположена:
Цитата Сообщение от nd2 Посмотреть сообщение
это уже имеет отношение к компиляторам, ОС и т.п.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
09.03.2017, 23:59
Цитата Сообщение от Notoriously Посмотреть сообщение
И я правильно понимаю,что даже области памяти (статическая, стек и куча) стандартом не детерминированы?
Память - она вся одинаковая. И никаких областей в ней нет. Области памяти - это концепции, продукт чьего-то воображения, выдуманные специально для использования в тех темах и контекстах, где они уместны.

В языках С и С++, как таковых, эти концепции никому низачем не нужны. В языках С и С++ есть понятие продолжительности хранения объекта (storage duration), а также (в С++) понятие времени жизни объекта (lifetime). Вот именно этим и различаются локальные, статические и динамические объекты. И вот это и есть те концепции, которые используются в С и С++. А причем и зачем здесь какие-то "области памяти" - мне в упор не ясно.
2
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
10.03.2017, 00:46  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
какие-то "области памяти"
Так этот материал приподносят в учебных заведениях.
А я верю, к сожалению. (верил)
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
продолжительности хранения объекта (storage duration), а также (в С++) понятие времени жизни объекта (lifetime)
"The storage duration is the property of an object that defines the minimum potential lifetime of the storage
containing the object."

"The lifetime of an object or reference is a runtime property of the object or reference."
То есть время жизни - менее общее понятие , нежели продолжительность хранения, характеризующая именно поведение объекта во время выполнения программы?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
10.03.2017, 01:14
Цитата Сообщение от Notoriously Посмотреть сообщение
То есть время жизни - менее общее понятие , нежели продолжительность хранения, характеризующая именно поведение объекта во время выполнения программы?
Оба понятия относятся к времени выполнения программы.

Продолжительность хранения - это промежуток времени между тем моментом, как для объекта была выделена "сырая" память (заполненная условным мусором), и тем моментом, как эта память была освобождена.

Время жизни - это промежуток времени между тем моментом, как в выделенной "сырой" памяти был сконструирован полноценный объект, и тем моментом, как этот объект был детструктирован (память при этом остается, но становится "сырой").

То есть время жизни всегда вложено в продолжительность хранения:

начало хранения -> [сырая память ] -> начало жизни -> [объект существует ] -> конец жизни -> [сырая память ] -> конец хранения.

Для тривиальных объектов, не требующих конструирования и/или деструктирования, эти два понятия полностью совпадают. Так, например, обстоит дело с объектами типа double или std::array<int, 5>. Так обстоит дело с любыми объектами в языке С.

А вот в языке С++ есть нетривиальные объекты, т.е. объекты с нетривиальными конструкторами и/или деструкторами. Для них эти понятия не обязательно совпадают. Например, std::string.

Добавлено через 9 минут
Цитата Сообщение от Notoriously Посмотреть сообщение
Так этот материал приподносят в учебных заведениях.
А я верю, к сожалению. (верил)
Ну зачем так грустно.

Время жизни и продолжительность хранения - это педантичные абстрактные концепции, используемые в стандарте языка.

Если же вам больше нравится выражать те же идеи через "области памяти" - никто вам не запретит. Просто спецификация языка выбрала другой подход.
0
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
10.03.2017, 01:18  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
т.е. объекты с нетривиальными конструкторами и/или деструкторами
Вроде бы ясно. Постараюсь чуть подробнее въехать и ежели не пойму, спрошу еще.
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.03.2017, 01:18

Расположение полей структуры в памяти
Есть структура MyStruct содержащая в себе два поля int. Есть массив объектов MyStruct. Гарантируется ли что поля MyStruct будут расположены...

Расположение в памяти полей и методов класса
помогите пожалуйста с вопросом: расположение в памяти полей и методов класса

Размещение переменных в памяти
пользуюсь Dev-C++, стало интересно, как компиляторы размещают даныые: последовательно, или как попало? предположим есть объявление int i;...

Функция размещения переменных в динамической памяти!
Подскажите ошибку! вроде все сделал по методе, а не работает! проблема с переменными iP1, iP2, iP3 Правда в методе было написано так ...

Динамическое выделение памяти для глобальных переменных
задача стоит такая: с датчика потоком идет информация, её необходимо сохранять в ОЗУ (в глобальную переменную) хотел было объявить...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru