Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

Как обратиться к значениям двухмерного массива созданного с выделением динамической памяти? - C++
Здравствуйте. Есть такой код (не полностью) #include <iostream> #include <windows.h> #include <ctime> #include <fstream> ...

Как узнать размер массива? - C++
Нужно узнать размер введенного пользователем массива, но sizeof() почему-то не работает, помогите пожалуйста разобраться! int...

Как узнать размер массива - C++
В задаче нужно для решения узнать размер массива. Если sizeof() возвращает кол-во занятой памяти в байтах, и sizeof(char)=2, то ...

Как узнать размер массива? - C++
Имею функцию template <typename T> int funk(T mas, T element) { //kod }

5
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 скорее всего с ошибками будет
0
0x10
2479 / 1652 / 248
Регистрация: 24.11.2012
Сообщений: 4,093
16.08.2013, 20:37 #3
BESSON_off, когда выделяешь память, явно указываешь размер, т.е. гарантировано знаешь его. Дальше - таскать везде за собой эту переменную.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 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
5
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 21:58 #5
Для всеобщего понимания объясню что хотели сказать во 2-м и 4-м посте.
Дело в том, что размер памяти, выделяемой функциями malloc, calloc, оператором new в C++ и прочими аллокаторами должен где-то храниться. Разумеется в самой выделенной памяти он храниться не может, т.к. запросто затрется другими данными. После блока выделенной памяти он храниться тоже не может, т.к. функция free и оператор delete в C++ просто не смогут его найти, т.к. для того чтобы его найти надо будет знать его размер.
Отсюда следует вывод: самый простой и очевидный способ хранения размера выделенного блока памяти следует хранить перед самим блоком памяти, например: мы выделяем блок памяти размером 10 байт, получаем указатель на выделенную область памяти: 0xaabbccdd, тем самым размер этой области (например 4 байта - 2 в 32-й степени) записывается в адрес 0xaabbccd9, т.е. функция/оператор освобождения памяти уже знает какой именно размер памяти пометить свободным.
Надеюсь кому-то помог мой ликбез.
Стоит обратить внимание, что все это зависит от реализации компилятора. Каждый может вести себя "немного" по-своему...

Добавлено через 59 секунд
Ах да, мораль сей басни такова: узнать безопасно - никак.
2
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
17.08.2013, 20:03  [ТС] #6
Цитата Сообщение от Croessmah Посмотреть сообщение
в Visual C++ есть не стандартная функция позволяющая узнать размер выделенной памяти в байтах:
Усвоил! Спасибо!
0
17.08.2013, 20:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2013, 20:03
Привет! Вот еще темы с ответами:

Индексация массива в динамической памяти - C++
Всем привет! Вроде очень простой вопрос, но я не смог найти на него ответа. Вот код: #include &lt;iostream&gt; using namespace std; ...

Выделение динамической памяти для массива точек - C++
Доброго времени суток. Вот у нас есть структура точка struct point { double x,y; } p;

Выделение динамической памяти для двумерного массива. - C++
#include &lt;iostream&gt; int main() { setlocale( LC_ALL,&quot;Russian&quot; ); int N, M; std::cout &lt;&lt; &quot;Введите кол-во строк в массиве:...

Правильное выдиление динамической памяти для двумерного массива - C++
#include'iostream.h' #include'stdio.h' #include'string.h' void main() { char **text; int i,j,k,nm; char s; ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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