Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
13 / 13 / 6
Регистрация: 27.05.2012
Сообщений: 208

Как происходит процесс выделения памяти в стеке и куче

16.01.2014, 14:46. Показов 8216. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include "disc.h"
void main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  
  Disc d1,d2[2];
  Disc *d3,*d4;
  d3=new Disc;
  int kol=0,n;
  clrscr();
  kol++;
  printf("%i)",kol);
  printf("\nВведите название дисциплины -> ");
  gets(d1.namedisc);
  printf("Введите имя перподавателя -> ");
  gets(d1.teacher_name);
  printf("Введите название группы -> ");
  gets(d1.name_group);
  printf("Введите кол-во часов на изуч. дисциплины-> ");
  scanf("%i",&d1.hours);
  fflush(stdin);
  
  for (int i=0; i<1; i++)
  {
    clrscr();
    kol++;
    printf("%i)",kol);
    printf("\nВведите название дисциплины -> ");
    gets(d2[i].namedisc);
    printf("Введите имя перподавателя -> ");
    gets(d2[i].teacher_name);
    printf("Введите название группы -> ");
    gets(d2[i].name_group);
    printf("Введите кол-во часов на изуч. дисциплины-> ");
    scanf("%i",&d2[i].hours);
    fflush(stdin);
  }
 
  clrscr();
  kol++;
  printf("%i)",kol);
  printf("\nВведите название дисциплины -> ");
  gets(d3->namedisc);
  printf("Введите имя перподавателя -> ");
  gets(d3->teacher_name);
  printf("Введите название группы -> ");
  gets(d3->name_group);
  printf("Введите кол-во часов на изуч. дисциплины-> ");
  scanf("%i",&d3->hours);
  fflush(stdin);
 
  printf ("\n Введите кол-во записей-> ");
  scanf ("%i",&n);
  d4=new Disc [n];
  fflush(stdin);
  for (int i=0; i<n; i++)
  {
    clrscr();
    kol++;
    printf("%i)",kol);
    printf("\nВведите название дисциплины -> ");
    gets(d4[i].namedisc);
    printf("Введите имя перподавателя -> ");
    gets(d4[i].teacher_name);
    printf("Введите название группы -> ");
    gets(d4[i].name_group);
    printf("Введите кол-во часов на изуч. дисциплины-> ");
    scanf("%i",&d4[i].hours);
    fflush(stdin);
  }
  clrscr();
  kol=0;
  printf("\n------------------------------------------------------------");
  printf("\n|№|Название дисциплины |Имя преподавателя   |Имя группы|Час|");
  printf("\n------------------------------------------------------------");
  kol++;
  printf("\n|%1i|%20s|%20s|%10s|%3i|",kol,d1.namedisc,d1.teacher_name,d1.name_group,d1.hours);
  for (int i=0; i<1; i++)
    printf("\n|%1i|%20s|%20s|%10s|%3i|",kol+i+1,d2[i].namedisc,d2[i].teacher_name,d2[i].name_group,d2[i].hours);
  kol+=3;
   printf("\n|%1i|%20s|%20s|%10s|%3i|",kol,d3->namedisc,d3->teacher_name,d3->name_group,d3->hours);
  for (int i=0; i<n; i++)
    printf("\n|%1i|%20s|%20s|%10s|%3i|",kol+i+1,d4[i].namedisc,d4[i].teacher_name,d4[i].name_group,d4[i].hours);
  kol+=2;  
  printf("\n------------------------------------------------------------");
  getch();
  delete d3;
  delete []d4;
}
C++
1
2
3
4
5
6
7
8
class Disc
{
  public:
  char namedisc[20];
  char teacher_name[20];
  char name_group[10];
  int hours;
};
Тут я просто вывожу в табличке свой класс, просто 4 способами, через переменную, массив, указатель и дин.массив. Вопрос вот выделении памяти под объекты класса (d1,d2[i],*d3,*d4);
писал sizeof для каждого объекта и получил что
d1=56 байта (тут вроде 3 chara 20+20+10+ 1 int=4 байтам=54 байта, куда выделяются еще 2 байта?)
d2=112 байта (ну тут понятно, что записей в массиве 2, 56+56=112)
d3=4 байта (тут 4 байта при записи sizeof(d3)-т.е. на каждое поле класса, их всего 4 выделяется по 1 байту?)
(а если написать sizeof(*d3) то будет снова 56 байт
d4=4 байта (тут аналогично)
Объясните пожалуйста, как происходит процесс выделения памяти в стеке и куче, ну и про кол-во байтов на объекты класса.
Все это делаю в C++ Builder 6
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.01.2014, 14:46
Ответы с готовыми решениями:

Как автоматизировать такой процесс выделения памяти?
Скажите пожалуйста, как автоматизировать такой процесс выделения памяти? double* m01 = (double*)::malloc( windows_size...

Как происходит процесс распределения памяти(для процессов) на уровне ядра
На сколько я понял, ядро Windows - распределяет виртуальную память в user пространстве 0x00000000-0x7FFFFFFF для запускаемых процессов и...

Как выделяется память на стеке и на куче? Когда нужна ручная очистка?
Всем здрасьте. //1 char s = 's'; //2 char* ss = new char; Во втором случае компилятор выделяет участок памяти, потом мне же её...

48
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 22:18
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ValeryS Посмотреть сообщение
но помню что пытался считать размер массива ничего не получилось, приходилось запоминать
с объектами может быть тоже самое, а может и нет
Не посмотрел, что у него массивы. С массивами, конечно, не получится, с объектами нормально выдаёт размер.
1
13 / 13 / 6
Регистрация: 27.05.2012
Сообщений: 208
16.01.2014, 22:20  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
А так размер объекта не даст?
C++
1
sizeof(*d3);
так выдается размер объекта с выравниванием = 56 байт

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Не посмотрел, что у него массивы. С массивами, конечно, не получится, с объектами нормально выдаёт размер.
хм...
C++
1
printf("\n d2 memory = %d",sizeof(d2));
(d2 массив) (код из 1 поста)
выдает 112 байт (56+56 т.к. массив d2[2]);
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 22:22
Цитата Сообщение от Lers Посмотреть сообщение
хм...
С динамическими.
0
13 / 13 / 6
Регистрация: 27.05.2012
Сообщений: 208
16.01.2014, 22:25  [ТС]

вот sizeof к каждому объекту!
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
16.01.2014, 22:27
опять сообщение потерялось
повторюсь
Цитата Сообщение от alsav22 Посмотреть сообщение
с объектами нормально выдаёт размер.
не знал
надо будет попробовать
никаких подводных камней?
0
13 / 13 / 6
Регистрация: 27.05.2012
Сообщений: 208
16.01.2014, 22:27  [ТС]
C++
1
2
3
4
5
printf("\n d1 memory = %d",sizeof(d1));
  printf("\n d2 memory = %d",sizeof(d2));
  printf("\n d3 memory = %d",sizeof(d3));
  printf("\n d4 memory = %d",sizeof(d4));
  printf("\n disc memory = %d",sizeof(Disc));
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
16.01.2014, 22:30
Цитата Сообщение от Lers Посмотреть сообщение
printf("\n d3 memory = %d",sizeof(d3));
* printf("\n d4 memory = %d",sizeof(d4));
здесь ты получаешь размер указателя
а он и есть 4 байта
а размер объекта узнавай как alsav22, написал
Цитата Сообщение от alsav22 Посмотреть сообщение
sizeof(*d3);
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 22:30
Цитата Сообщение от ValeryS Посмотреть сообщение
никаких подводных камней?
Не знаю.
C++
1
2
3
4
5
printf("\n d1 memory = %d",sizeof(d1));
printf("\n d2 memory = %d",sizeof(d2));
printf("\n d3 memory = %d",sizeof(*d3));
printf("\n d4 memory = %d",sizeof(*d4) * n);
printf("\n disc memory = %d",sizeof(Disc));
0
13 / 13 / 6
Регистрация: 27.05.2012
Сообщений: 208
16.01.2014, 22:32  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
здесь ты получаешь размер указателя
а он и есть 4 байта
а размер объекта узнавай как alsav22, написал
я знаю, писал же, что узнал и размер указателя и размер объекта)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2014, 22:32

Расположение данных в стеке и в куче
Друзья, возник вопрос. Следующий код char length_buffer; ...заполнение length_buffer двоичным представлением целого числа 999... ...

Создание массивов в стеке и куче
&quot;Напишите небольшую программу,которая создаёт массивы в стеке(массивы фиксированного размера) и массивы в куче(с помощью распределения...

Интерфейс хранится в стеке или в куче?
интерфейс хранится в стеке или в куче?

Создание QApplication на стеке или в куче
Только начал разбираться с QT и появилось неск. глупых вопросов: - Какая разница между QApplication app (argc, argv); и ...

Несколько моментов про хранение в куче и в стеке
Хотел уточнить несколько моментов про хранение в куче и в стеке: 1) Ссылочные типы всегда хранятся в куче? 2) Типы значений всегда...


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

Или воспользуйтесь поиском по форуму:
49
Ответ Создать тему
Новые блоги и статьи
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru