Получить длину динамического массива
Реализация динамического массива
Здравствуйте =) подскажиет как релизовать на c# одноменый динамический массив элемент которого.
Создание динамического массива в C#
Приветствую всех! Даны 2 массива размерности M и N соответственно. Необходимо переписать в третий.
Заполнение динамического массива в С#
Пытаюсь заполнить массив элементами от начального значения (demarrer) до конечного (finale) с.
Как узнать размер динамического массива
![]()
Еще, кстати, замечу, что sizeof(word[0] равен единице — это размер символа ASCII. Так что формулу в данном случае можно немного упростить.
И еще замечу, что массив у вас никакой не динамический, а самый что ни на есть статический.
![]()
В данном объявлении
объявляется не объект массива, а объект указателя, который указывает на первый символ строкового литерала. И размер указателя фиксирован независимо от того, указывает ли он на скалярный объект, или на первый элемент массива.
Заметьте, что в C++ строковые литералы имеют тип константных символьных массивов. Поэтому указатель, который указывает на строковый литерал, должен объявляться с квалификатором const :
Чтобы объявить именно массив, нужно написать
Тогда вы, действительно, можете использовать выражение sizeof( word ) / sizeof( *word ) для подсчета элементов в массиве.
В случае массивов, или указателей на массивы, содержащие строки, вы также можете использовать стандартную функцию strlen, для определения, сколько символов в строке (исключая завершающий ноль).
Как узнать длину динамического массива c
Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007
Репутация: нет
Всего: нет
| Код |
| int *ar; // указатель на элемент массива int size=100; |
ar=new int[size]; //Выделение памяти
memset(ar,0,size); //Инициализация
size = sizeof(ar); // выдает 4
Похоже, что размер динамического массива узнать в C++, (у меня Borland C++) невозможно, и надо каждый раз передавать его размер как параметр. Это так?
Спасибо
Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006
Репутация: 2
Всего: 50
| Цитата |
| невозможно |
| Код |
| strlen(size); |
Добавлено через 34 секунды
В других случаях надо передавать размер массива.
Добавлено через 1 минуту и 5 секунд
| Цитата |
| Код |
| size = sizeof(ar); // выдает 4 |
Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина
Репутация: 29
Всего: 69
| Цитата(TheDestroyer @ 2.4.2009, 13:04 ) |
| и надо каждый раз передавать его размер как параметр |
один из способов избежать передачи размера в качестве отдельного параметра заключается в передачи пары итераторов на начало массива и на элемент после его конца.
ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы.
Это сообщение отредактировал(а) zim22 — 2.4.2009, 13:20
Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007
Репутация: 13
Всего: 41
| Цитата |
| size = sizeof(ar); |
| Код |
| int *ar; // указатель на элемент массива int size=100; ar=new int[size]; //Выделение памяти memset(ar,0,size); //Инициализация int size1=sizeof(int)*size; delete[] ar; |
Это сообщение отредактировал(а) Dmi3ev — 2.4.2009, 13:14
Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006
Репутация: 2
Всего: 50
заверни свои данные в структуру и передавай ее в функцию
Это сообщение отредактировал(а) Alca — 2.4.2009, 13:22
Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина
Репутация: 29
Всего: 69
| Цитата(Dmi3ev @ 2.4.2009, 13:14 ) |
| int size1=sizeof(int)*size; |
| Код |
| int size1=sizeof(size)*size; |
Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006
Репутация: 79
Всего: 250
| Цитата(zim22 @ 2.4.2009, 12:14 ) |
| один из способов избежать передачи размера в качестве отдельного параметра заключается в передачи пары итераторов на начало массива и на элемент после его конца. ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы. |
Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения
Репутация: 52
Всего: 211
| Цитата |
| ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы. |
| Код |
| template <class T> T* newArray(size_t count) < T* r = new T[count + 1]; r[0] = count; return ++r; > |
что-то вроде этого
Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур
Репутация: 19
Всего: 306
Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур
Репутация: 19
Всего: 306
Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения
Репутация: 52
Всего: 211
по любому у этих методов полно недостатков, лучше передавать..либо в структуре, либо просто так..без разницы
Добавлено через 2 минуты и 3 секунды
а еще лучше — как сказали
mrbrooks,
mes используй вектор
Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург
Репутация: 5
Всего: 59
| Цитата(mes @ 2.4.2009, 13:37 ) |
| еще один : использовать std::vector и отградить себя от рутинной работы по контролю за динамическим массивом. |
Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина
Репутация: 29
Всего: 69
| Цитата(TheDestroyer @ 2.4.2009, 13:04 ) |
| Возможно ли узнать размер динамического массива? |
| Код |
| template <typename T, size_t size> size_t get_size(const T (&arr)[size]) < return size; > int _tmain(int argc, _TCHAR* argv[]) < int arr[25]; size_t size = get_size(arr); return 0; > |
Профиль
Группа: Участник
Сообщений: 59
Регистрация: 11.10.2008
Где: Україна
Репутация: 2
Всего: 2
| Код |
| #include <iostream> using namespace std; |
Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007
Репутация: 13
Всего: 41
| Цитата |
| Т.к. если вы вдруг измените тип переменной size, то размер будет считаться неправильно. |
| Код |
| ar=new int[size]; |
| Цитата |
| int size1=sizeof(size)*size; |
ненадежно!
потому как, size — это количество элементов, и эта переменная будет неизменна, независимо от того какого типа будет массив и тд.
zim22, ты в этот раз не прав.
Запрещается!
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
- Действия модераторов можно обсудить здесь
- С просьбами о написании курсовой, реферата и т.п. обращаться сюда
- Вопросы по реализации алгоритмов рассматриваются здесь
- FAQ раздела лежит здесь!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
[ Время генерации скрипта: 0.1864 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Как узнать длину динамического массива c
Количество элементов массива задается при объявлении и не может быть изменено позже. Поэтому лучше количество элементов сохранить в константе или макросе и в дальнейшем указывать эту константу, например, при переборе элементов массива. Чтобы получить количество элементов массива динамически при выполнении программы, нужно общий размер массива в байтах разделить на размер типа. Получить эти размеры можно с помощью оператора sizeof . Пример динамического определения количества элементов массива:
Можно также воспользоваться макросом _countof() :
Если мы сохраним адрес первого элемента массива в указателе и попробуем определить количество элементов массива через него, то ничего не получится. Результатом будет размер указателя:
Объем памяти (в байтах), занимаемый массивом, определяется так:

Учебник C++ (Qt Creator и MinGW) в формате PDF
Помощь сайту
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов
длина динамического массива
знаю, что с помощью стандартных способов это невозможно (в c++), но, например, в Java это можно сделать с помощью метода length, а на c++ как это можно реализовать?
Следует учесть, что массивы могут быть и двумерными.
Заранее благодарен за любую помощь!
10 ответов
Спасибо, помогло :о)
НО. _msize возвращает значение только для памяти выделенной с помощью malloc(), а как быть с оператором new?
выводит 128. Коллеги, можно ли (поддерживается ли это системой) использовать new и _msize вместе?
Насколько я знаю, оператор new работает через malloc, который, в свою очередь через HeapAlloc. Аналогичная схема и с delete: delete -> free -> HeapFree.
Если эта схема правильная, то использование _msize — допустимо.
Господа, по-моему гораздо проще и элегантнее использовать схему аналогичную си-строкам — в конце массива хранить специальный элемент-терминатор (в простейшем случае 0), и узнавать размер, прогулявшись по массиву.
ЗЫ : А если код такой
1. Речь здесь идет совсем о другом.
2. strlen — функция, для работы со строками в стиле С (ASCII(Z)). Название темы внимательно прочитай.
Обсасываем проблему высосанную из пальца?
Если сам создал массив, значит должен и длину знать.
Если мучает склероз, сохрани длину в соотв. переменной, рядом с массивом.
Какие проблемы? В чем сложность? Зачем делать простые вещи через задние проходы?
Тут кстати, поблизости есть тема, о пользе контейнеров:)
мне нужно написать одну программку, но в ней массивы вида m[a][c]. причем a,b,c каждый раз разные, и подобных массивов очень много создается по ходу работы программы.
Вот я и решил что проще узнавать как-то размер блока памяти по указателю на него, чем хранить где-то количество элементов в таких массивах.
Как узнать размер динамического массива в C++ [дубликат]
код для динамического массива путем ввода размера и сохранения его в переменную «n», но я хочу получить длину массива из метода шаблона, а не с помощью «n».
этот код похож, но с использованием динамический массив:
1 ответов
вы не можете. Размер массива, выделенного с помощью new[] не хранится каким-либо образом, в котором он может быть доступен. Обратите внимание, что возвращаемый тип new [] — это не массив — это указатель (указывающий на первый элемент массива). Так что если вам нужно знать длину динамического массива, вы должны хранить его отдельно.
конечно, правильный способ сделать это, избежав new[] и с помощью std::vector вместо этого, который хранит длину для вас, и это исключение-безопасно сапог.