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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 338
#1

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

16.08.2013, 20:19. Просмотров 2330. Ответов 5
Метки нет (Все метки)

Добрый вечер еще раз!

Напишите пожалуйста как можно узнать истинный размер массива, находящегося в динамической памяти, созданными при помощи malloc или calloc. Т.к. если выделить константный размер массива в динамической памяти (например
C++
1
char * ptr = (char*)calloc(10,1)
и заполнить его 8 символами, то функция strlen(ptr) выдаст нам 8, в то время как массив имеет размер в 10 бит, а функция sizeof() возвращает нам либо размер самого указателя, либо размер ptr[0] ячейки.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2013, 20:19     Как узнать размер массива в динамической памяти?
Посмотрите здесь:

C++ Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Выделение динамической памяти для двумерного массива. C++
C++ Узнать количество динамической памяти
C++ Правильное выдиление динамической памяти для двумерного массива
Узнать размер массива C++
Как узнать размер массива? C++
Индексация массива в динамической памяти C++
C++ Как узнать размер массива
C++ Выделение динамической памяти для массива точек
C++ Как узнать размер массива?
Как обратиться к значениям двухмерного массива созданного с выделением динамической памяти? C++
Узнать размер динамического массива C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
2450 / 1622 / 238
Регистрация: 24.11.2012
Сообщений: 3,992
16.08.2013, 20:37     Как узнать размер массива в динамической памяти? #3
BESSON_off, когда выделяешь память, явно указываешь размер, т.е. гарантировано знаешь его. Дальше - таскать везде за собой эту переменную.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12532 / 7094 / 797
Регистрация: 27.09.2012
Сообщений: 17,504
Записей в блоге: 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
Эксперт С++
4870 / 3009 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 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
Сообщений: 338
17.08.2013, 20:03  [ТС]     Как узнать размер массива в динамической памяти? #6
Цитата Сообщение от Croessmah Посмотреть сообщение
в Visual C++ есть не стандартная функция позволяющая узнать размер выделенной памяти в байтах:
Усвоил! Спасибо!
Yandex
Объявления
17.08.2013, 20:03     Как узнать размер массива в динамической памяти?
Ответ Создать тему
Опции темы

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