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

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

16.01.2014, 14:46. Показов 8118. Ответов 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,875
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,875
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
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция 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,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru