Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
16.08.2013, 20:19     Как узнать размер массива в динамической памяти? #1
Добрый вечер еще раз!

Напишите пожалуйста как можно узнать истинный размер массива, находящегося в динамической памяти, созданными при помощи malloc или calloc. Т.к. если выделить константный размер массива в динамической памяти (например
C++
1
char * ptr = (char*)calloc(10,1)
и заполнить его 8 символами, то функция strlen(ptr) выдаст нам 8, в то время как массив имеет размер в 10 бит, а функция sizeof() возвращает нам либо размер самого указателя, либо размер ptr[0] ячейки.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BigLow
55 / 55 / 2
Регистрация: 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 скорее всего с ошибками будет
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
16.08.2013, 20:37     Как узнать размер массива в динамической памяти? #3
BESSON_off, когда выделяешь память, явно указываешь размер, т.е. гарантировано знаешь его. Дальше - таскать везде за собой эту переменную.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,924
Записей в блоге: 2
Завершенные тесты: 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-ru/library/z2s077bc.aspx
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 21:58     Как узнать размер массива в динамической памяти? #5
Для всеобщего понимания объясню что хотели сказать во 2-м и 4-м посте.
Дело в том, что размер памяти, выделяемой функциями malloc, calloc, оператором new в C++ и прочими аллокаторами должен где-то храниться. Разумеется в самой выделенной памяти он храниться не может, т.к. запросто затрется другими данными. После блока выделенной памяти он храниться тоже не может, т.к. функция free и оператор delete в C++ просто не смогут его найти, т.к. для того чтобы его найти надо будет знать его размер.
Отсюда следует вывод: самый простой и очевидный способ хранения размера выделенного блока памяти следует хранить перед самим блоком памяти, например: мы выделяем блок памяти размером 10 байт, получаем указатель на выделенную область памяти: 0xaabbccdd, тем самым размер этой области (например 4 байта - 2 в 32-й степени) записывается в адрес 0xaabbccd9, т.е. функция/оператор освобождения памяти уже знает какой именно размер памяти пометить свободным.
Надеюсь кому-то помог мой ликбез.
Стоит обратить внимание, что все это зависит от реализации компилятора. Каждый может вести себя "немного" по-своему...

Добавлено через 59 секунд
Ах да, мораль сей басни такова: узнать безопасно - никак.
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
17.08.2013, 20:03  [ТС]     Как узнать размер массива в динамической памяти? #6
Цитата Сообщение от Croessmah Посмотреть сообщение
в Visual C++ есть не стандартная функция позволяющая узнать размер выделенной памяти в байтах:
Усвоил! Спасибо!
Yandex
Объявления
17.08.2013, 20:03     Как узнать размер массива в динамической памяти?
Ответ Создать тему
Опции темы

Текущее время: 14:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru