Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

длина динамического массива

354
18 декабря 2006 года
ШпиЁн
468 / / 19.02.2006
имеется массив байт. выделенный динамически. как можно узнать его длину? :о)

знаю, что с помощью стандартных способов это невозможно (в c++), но, например, в Java это можно сделать с помощью метода length, а на c++ как это можно реализовать?

Следует учесть, что массивы могут быть и двумерными...

Заранее благодарен за любую помощь!
9
18 декабря 2006 года
Lerkin
3.0K / / 25.03.2003
Если я правильно понял вопрос, то размер первичного массива (в байтах), можно узнать вот этим:
 
Код:
size_t _msize(void *memblock);

но только, если память была выделена calloc, malloc или realloc.
1.8K
18 декабря 2006 года
k3Eahn
365 / / 19.12.2005
Что-то вроде GetProcessHeaps --> HeapWalk. И смотришь для каждого блока, на случай если он выделен под данный массив.
354
19 декабря 2006 года
ШпиЁн
468 / / 19.02.2006
Спасибо, помогло :о)

НО... _msize возвращает значение только для памяти выделенной с помощью malloc(), а как быть с оператором new?
 
Код:
char * s = new char[128];
strcpy(s, "hello, world!");
cout << _msize(s) << endl;


выводит 128. Коллеги, можно ли (поддерживается ли это системой) использовать new и _msize вместе?
240
20 декабря 2006 года
aks
2.5K / / 14.07.2006
В любом случае - это нелегитимное решение. Зачем тебе узнавать размер памяти по указателю - длину надо хранить всегда.
9
20 декабря 2006 года
Lerkin
3.0K / / 25.03.2003
Цитата: ШпиЁн
...
... _msize возвращает значение только для памяти выделенной с помощью malloc(), а как быть с оператором new?



Насколько я знаю, оператор new работает через malloc, который, в свою очередь через HeapAlloc. Аналогичная схема и с delete: delete -> free -> HeapFree.

Если эта схема правильная, то использование _msize - допустимо.

11K
20 декабря 2006 года
_io_lock
73 / / 05.10.2006
Господа, по-моему гораздо проще и элегантнее использовать схему аналогичную си-строкам - в конце массива хранить специальный элемент-терминатор (в простейшем случае 0), и узнавать размер, прогулявшись по массиву.

ЗЫ : А если код такой
 
Код:
char* p = new char[N];  // массив байт, верна ? ;)
  // и если в массиве p заведомо нет нулей, то попросту
  unsigned length = strlen(p);
9
20 декабря 2006 года
Lerkin
3.0K / / 25.03.2003
Цитата: _io_lock

...
 
Код:
char* p = new char[N];  // массив байт, верна ? ;)
  // и если в массиве p заведомо нет нулей, то попросту
  unsigned length = strlen(p);



1. Речь здесь идет совсем о другом.
2. strlen - функция, для работы со строками в стиле С (ASCII(Z)). Название темы внимательно прочитай. :)

3
20 декабря 2006 года
Green
4.8K / / 20.01.2000
Обсасываем проблему высосанную из пальца?
Если сам создал массив, значит должен и длину знать.
Если мучает склероз, сохрани длину в соотв. переменной, рядом с массивом.

Какие проблемы? В чем сложность? Зачем делать простые вещи через задние проходы?
63
20 декабря 2006 года
Zorkus
2.6K / / 04.11.2006
Цитата: Green

Если мучает склероз, сохрани длину в соотв. переменной, рядом с массивом.


Тут кстати, поблизости есть тема, о пользе контейнеров:)

354
20 декабря 2006 года
ШпиЁн
468 / / 19.02.2006
мне нужно написать одну программку, но в ней массивы вида m[a][c]... причем a,b,c каждый раз разные, и подобных массивов очень много создается по ходу работы программы.

Вот я и решил что проще узнавать как-то размер блока памяти по указателю на него, чем хранить где-то количество элементов в таких массивах.

Вариант с контейнерами хорош конечно, но мне нужно быстродействие.

Всем спасибо за советы, вопрос исчерпан.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог