С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/56: Рейтинг темы: голосов - 56, средняя оценка - 4.64
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
1

Как узнать размер массива в динамической памяти?

16.08.2013, 20:19. Показов 11670. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер еще раз!

Напишите пожалуйста как можно узнать истинный размер массива, находящегося в динамической памяти, созданными при помощи malloc или calloc. Т.к. если выделить константный размер массива в динамической памяти (например
C++
1
char * ptr = (char*)calloc(10,1)
и заполнить его 8 символами, то функция strlen(ptr) выдаст нам 8, в то время как массив имеет размер в 10 бит, а функция sizeof() возвращает нам либо размер самого указателя, либо размер ptr[0] ячейки.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2013, 20:19
Ответы с готовыми решениями:

Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Скажем я в какой-то момент выделяю память под массив: int *a = new int ; затем память может...

Как можно узнать размер динамической страницы
Здравствуйте, уважаемые форумчане. Погуглив не нашел ничего стоящего. Подскажите код php как можно...

Как узнать размер оперативной памяти?
Привет, меня интересует,- как определить размер озу без О.С и если на ней ни чего не написано? Я...

Как узнать размер проги в памяти ?
Уважаемые эксперты ! Подскажите пожалуйста: как можно узнать начальный и конечный адрес любой...

7
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
16.08.2013, 20:34 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    char    *p;
 
    p = (char *)calloc(10, 1);
 
    std::cout << "размер массива = " << *(reinterpret_cast<int *>(p)-4) << std::endl;
 
    free(p);
    
    system("pause");
    return 0;
}
В Visual Studio правильно работает, а в других IDE скорее всего с ошибками будет
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
16.08.2013, 20:37 3
BESSON_off, когда выделяешь память, явно указываешь размер, т.е. гарантировано знаешь его. Дальше - таскать везде за собой эту переменную.
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
16.08.2013, 20:43 4
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от BESSON_off Посмотреть сообщение
Напишите пожалуйста как можно узнать истинный размер массива, находящегося в динамической памяти, созданными при помощи malloc или calloc.
В общем случае никак - только таскать с собой размер.
Например, в Visual C++ есть не стандартная функция
C++
1
size_t __cdecl _msize ( void * pointer ) ;
позволяющая узнать размер выделенной памяти в байтах:
C++
1
2
3
4
int main(){
    int * p = (int*)calloc ( 100 , 4 ) ;
    std::cout << "size: " << _msize(p) ;
}
http://msdn.microsoft.com/ru-r... 077bc.aspx
5
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
16.08.2013, 21:58 5
Для всеобщего понимания объясню что хотели сказать во 2-м и 4-м посте.
Дело в том, что размер памяти, выделяемой функциями malloc, calloc, оператором new в C++ и прочими аллокаторами должен где-то храниться. Разумеется в самой выделенной памяти он храниться не может, т.к. запросто затрется другими данными. После блока выделенной памяти он храниться тоже не может, т.к. функция free и оператор delete в C++ просто не смогут его найти, т.к. для того чтобы его найти надо будет знать его размер.
Отсюда следует вывод: самый простой и очевидный способ хранения размера выделенного блока памяти следует хранить перед самим блоком памяти, например: мы выделяем блок памяти размером 10 байт, получаем указатель на выделенную область памяти: 0xaabbccdd, тем самым размер этой области (например 4 байта - 2 в 32-й степени) записывается в адрес 0xaabbccd9, т.е. функция/оператор освобождения памяти уже знает какой именно размер памяти пометить свободным.
Надеюсь кому-то помог мой ликбез.
Стоит обратить внимание, что все это зависит от реализации компилятора. Каждый может вести себя "немного" по-своему...

Добавлено через 59 секунд
Ах да, мораль сей басни такова: узнать безопасно - никак.
4
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
17.08.2013, 20:03  [ТС] 6
Цитата Сообщение от Croessmah Посмотреть сообщение
в Visual C++ есть не стандартная функция позволяющая узнать размер выделенной памяти в байтах:
Усвоил! Спасибо!
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 7
09.02.2020, 12:57 7
Мораль улыбнула.. Но как-то delete [] об этом узнает, дрянь он этакая...
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
09.02.2020, 13:40 8
Цитата Сообщение от temp81 Посмотреть сообщение
Но как-то delete [] об этом узнает
Законного доступа к этой информации у пользователя нет.
0
09.02.2020, 13:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2020, 13:40
Помогаю со студенческими работами здесь

Как узнать размер памяти программы (в параграфах)?
Вообщем, нужно определить при помощи функции 4Ah, размер памяти программы в параграфах. Вот...

Как узнать размер используемой памяти процесса?
Собственно, сабж. Возвращаемый размер должен совпадать с тем, что показывает диспетчер задач....

Как узнать размер страницы при страничной адресации памяти?
4 Кбайт или 4 Мбайт? В свойствах системы не могу найти; в XP просто искалось вроде. Спасибо, кто...

Узнать количество динамической памяти
Здравствуйте. Препод задал задание на работу с динамической памятью. Саму работу сделал, но теперь...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru