Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
Liebe23

Выделение памяти под типы данных - нужен совет!

18.02.2007, 01:14. Показов 6205. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста:

Внутри функции main() завожу подряд несколько переменных (new не использую, поэтому, как я понимаю переменные заносятся в стэк), и прошу вывести подряд их адреса.
Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
  unsigned short int ShortVar = 10;
  unsigned long int LongVar = 20;
  int Var = 30;
  unsigned short int *pShortVar = &ShortVar;
  unsigned long int *pLongVar = &LongVar;
  int *pVar = &Var;
  cout << "ShortVar adress: " << pShortVar <<endl;
  cout << "LongVar adress: " << pLongVar <<endl;
  cout << "Var adress: " << pVar <<endl;
  cout << sizeof(ShortVar) <<endl;
  cout << sizeof(LongVar) <<endl;
  cout << sizeof(Var) <<endl;
Строчки (10), (11), (12) я добавила специально, потому как хотелось проверить - сколько действительно байт тратится на переменную.

Результат выполнения программы меня поразил:

ShortVar adress: 1245066
LongVar adress: 1245060
Var adress: 1245056
2
4
4

На переменную типа unsigned long int 6 байт! И сразу же он пишет, что она занимает всего 4!

Затем я поменяла порядок объявления переменных в программе, но адреса НЕ изменились! То есть рез-т вывода адресов тот же. Только теперь переменная unsigned short int занимает 6 байт. (?!)

И последний вопрос:
почему меньший адрес имеет переменная, объявленная последней? Компилятор записывает их в обратном порядке?Зачем?


Если кто может помочь разобраться - буду Очень признательна. правда, не понимаю - в чем тут дело.
Спасибо
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.02.2007, 01:14
Ответы с готовыми решениями:

Стандартные типы объектов в C++ и выделение памяти под них
Всем здрасти :) У меня вот такой вопрос , а точнее даже вопросы ... допустим есть код : char *string = &quot;ABC&quot;; В данном...

Выделение активного пункта меню. Нужен совет!
Доброго времени суток, форумчане! Я в принципе нуб в CSS, помогите решить задачу. Необходимо выделить активные пункты меню (выделяется...

Нужен совет по оперативной памяти
Сейчас у меня стоит две планки DDR 2 NPC 800 6400 по 1 гб.Хочу их убрать , и поставить либо рс 8500 4ГБ или рс 6400 8 гб .Что лучше...

6
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
27.02.2007, 10:32
Совершенно неразумно определять размер переменной в байтах как разность адресов, для этого есть sizeof().

А по существу.
У компилятора есть опции выравнивания данных: см. Proect Option\Advanced Compiler\Data alignment. Если указано Quad word, то для переменной типа BYTE может быть выделено до 8-и байтов. На эту опцию компилятора надо обращать особое внимание при передаче структур или сохранении их в файле, так как она влияет на размер структур.
0
1 / 1 / 0
Регистрация: 03.03.2007
Сообщений: 11
03.03.2007, 23:29
Если проверять по адрессу то нада знать начало и конец.Т.к. 1245066
это начало, а что же не проверили начало следующей переменной?
0
0 / 0 / 0
Регистрация: 01.11.2006
Сообщений: 12
08.03.2007, 12:37
ето все, муть!!!!Потому что указатель содержит адрес, а размер указателя равен 4 байтам!!!
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
09.05.2009, 18:33
1 Да там полюбому указатель на переменную, а не сама переменная.
2 Пользуйтесь sizeof зачем изобретать велосипед.
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
28.07.2011, 12:47
Во вложении пример работы с bass.dll
Он пишет с микрофона звук и вывод гистограмму.
Так вот там в фунции void CALLBACK UpdateSpectrum(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)

при описании точек для гистограммы ясно дается именно такой пример:
specbuf[y*SPECWIDTH+x]=abs(y-SPECHEIGHT/2)*2+1;
specbuf имеет тип BYTE т.е. BYTE *specbuf;
Вложения
Тип файла: rar livespec.rar (103.2 Кб, 8 просмотров)
0
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
28.07.2011, 13:02
Я если честно балдею над вами! читайте книги, в конце концов для кого их тогда пишут???
самый простейший пример что бы разобраться
Вот, простейший пример(правда под линукс, по этому размеры отличаются)
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(void)
{
    printf("undigned short int: %d\t unsigned short int*: %d\n",sizeof(unsigned short int),sizeof(unsigned short int*));
    printf("unsigned long int: %d\t unsigned long int*: %d\n",sizeof(unsigned long int),sizeof(unsigned long int*));
    printf("int: %d\t int*: %d\n",sizeof(int),sizeof(int*));
    printf("double: %d\t double*: %d\n",sizeof(double),sizeof(double*));
    printf("float: %d\t float*: %d\n",sizeof(float),sizeof(float*));
    printf("char: %d\t char*: %d\n",sizeof(char),sizeof(char*));
    return 0;
}
а вот вывод
Bash
1
2
3
4
5
6
undigned short int: 2    unsigned short int*: 4
unsigned long int: 4     unsigned long int*: 4
int: 4   int*: 4
double: 8    double*: 4
float: 4     float*: 4
char: 1  char*: 4
тут закономерность видна сразу! что типы имеют разные значения байт(которые им выделяют), это от системы зависит, но указатель всегда равен 4 байтам!! все, тут говорить не о чем
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.07.2011, 13:02
Помогаю со студенческими работами здесь

Нужен совет по выделению памяти
Здравствуйте. В проекте частенько нужно выделять память только желательно проверять на bad_alloc. Написал функцию алокатор с...

Выделение памяти под файл
Всем доброго времени суток. Написал некоторую структуру, работают все пунктики, все функции, но нашёлся недочёт. Если записывать в файл...

Выделение памяти под указатель
Здравствуйте форумчане,у меня возник маленький вопрос:) Почему sizeof(char) дает результат в 1 байт, а sizeof(char*) ) дает 4 байта.Как...

Выделение памяти под массив
в массиве данных хранять в последовательных ячейках памяти В программе, выделенна память под массив, для ввода данных пользователем. ...

Выделение памяти под матрицу
Всем привет. float **AllocMat(int Rows, int Colomns) { float ** Mat; try { Mat = new...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru