Как узнать длину динамического массива c
Перейти к содержимому

Как узнать длину динамического массива c

  • автор:

Получить длину динамического массива

Реализация динамического массива
Здравствуйте =) подскажиет как релизовать на c# одноменый динамический массив элемент которого.

Создание динамического массива в C#
Приветствую всех! Даны 2 массива размерности M и N соответственно. Необходимо переписать в третий.

Заполнение динамического массива в С#
Пытаюсь заполнить массив элементами от начального значения (demarrer) до конечного (finale) с.

Как узнать размер динамического массива

freim's user avatar

Еще, кстати, замечу, что sizeof(word[0] равен единице — это размер символа ASCII. Так что формулу в данном случае можно немного упростить.

И еще замечу, что массив у вас никакой не динамический, а самый что ни на есть статический.

freim's user avatar

В данном объявлении

объявляется не объект массива, а объект указателя, который указывает на первый символ строкового литерала. И размер указателя фиксирован независимо от того, указывает ли он на скалярный объект, или на первый элемент массива.

Заметьте, что в 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)
Учебник 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 вместо этого, который хранит длину для вас, и это исключение-безопасно сапог.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *