как узнать размер динамического массива c
Получить длину динамического массива
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Реализация динамического массива
Здравствуйте =) подскажиет как релизовать на c# одноменый динамический массив элемент которого.
Создание динамического массива в C#
Приветствую всех! Даны 2 массива размерности M и N соответственно. Необходимо переписать в третий.
Заполнение динамического массива в С#
Пытаюсь заполнить массив элементами от начального значения (demarrer) до конечного (finale) с.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Очистка динамического массива
сколько уже изучаю c# и до сих пор так и не узнал как очищать, выденную под динамические массивы.
Создание динамического массива
Доброго времени суток. Такую задачу задал препод над которой, целой группой не можем найти ответа.
Получить наибольшую длину подряд идущих нечетных чисел
Дан массив целых чисел. Рассмотреть отрезки массива (группы цифр идущих подряд) состоящие из.
Как узнать размер динамического массива
Как узнать размер динамического массива.
при вызову sizeof или как пишут в интернете
всегда возвращается 4 при любом слове. А что за причина такая что можно легко узнать размер в байтах значения, а вот размер массива так сложно узнать. Я пришел из Java
2 ответа 2
У вас там не массив, а указатель на строку. Программа у вас 32-битная, поэтому и возвращается размер 4 байта, то есть размер указателя в 32-битной программе. Определите массив как
sz будет равно 9 (8 букв плюс завершающий 0).
И еще замечу, что массив у вас никакой не динамический, а самый что ни на есть статический.
В данном объявлении
объявляется не объект массива, а объект указателя, который указывает на первый символ строкового литерала. И размер указателя фиксирован независимо от того, указывает ли он на скалярный объект, или на первый элемент массива.
Заметьте, что в C++ строковые литералы имеют тип константных символьных массивов. Поэтому указатель, который указывает на строковый литерал, должен объявляться с квалификатором const :
Чтобы объявить именно массив, нужно написать
Тогда вы, действительно, можете использовать выражение sizeof( word ) / sizeof( *word ) для подсчета элементов в массиве.
В случае массивов, или указателей на массивы, содержащие строки, вы также можете использовать стандартную функцию strlen, для определения, сколько символов в строке (исключая завершающий ноль).
Как определить размер моего массива в C?
Как определить размер моего массива в C?
То есть, количество элементов, которые может содержать массив?
ОТВЕТЫ
Ответ 1
Управляющее резюме:
Полный ответ:
Чтобы определить размер вашего массива в байтах, вы можете использовать оператор sizeof :
На моем компьютере длина целых 4 байта, поэтому n равно 68.
Чтобы определить количество элементов в массиве, мы можем разделить общий размер массива на размер элемента массива. Вы можете сделать это с типом, как это:
Еще одним преимуществом является то, что теперь вы можете легко параметризовать имя массива в макросе и получить:
Ответ 2
Выход (в 64-разрядной ОС Linux):
Выход (в 32-разрядной ОС Windows):
Ответ 3
Стоит отметить, что sizeof не помогает при работе со значением массива, которое разложилось на указатель: хотя он указывает на начало массива, компилятору он совпадает с указателем на один элемент этого массива. Указатель не «помнит» ничего о массиве, который использовался для его инициализации.
Ответ 4
Итак: Если у вас есть следующее:
Вы можете найти количество элементов с таким кодом:
Это, для меня, намного легче, чем альтернатива с круглыми скобками. Я также предпочитаю использовать звездочку в правой части деления, поскольку она более лаконична, чем индексирование.
Конечно, это тоже время компиляции, поэтому нет необходимости беспокоиться о делении, влияющем на производительность программы. Поэтому используйте эту форму, где можете.
Всегда лучше использовать sizeof для фактического объекта, если он есть, а не на типе, поскольку вам не нужно беспокоиться о том, чтобы сделать ошибку и указать неправильный тип.
Например, скажем, у вас есть функция, которая выводит некоторые данные в виде потока байтов, например, по сети. Позвольте вызвать функцию send() и заставить в качестве аргументов указывать указатель на отправляемый объект и количество байтов в объекте. Итак, прототип будет выглядеть следующим образом:
И тогда вам нужно отправить целое число, поэтому вы выполните его следующим образом:
Теперь вы защищены. Конечно, вы дублируете имя переменной, но это имеет высокую вероятность взлома способом, который может обнаружить компилятор, если вы его измените.
Ответ 5
Откроется эта ссылка для объяснения
Ответ 6
Вы можете использовать оператор sizeof, но он не будет работать для функций, потому что для ссылки на указатель вы можете сделать следующее, чтобы найти длину массива:
Ответ 7
Если вам известен тип данных массива, вы можете использовать что-то вроде:
Или, если вы не знаете тип данных массива, вы можете использовать что-то вроде:
Примечание. Эта вещь работает только в том случае, если массив не определен во время выполнения (например, malloc), и массив не передается в функции. В обоих случаях arr (имя массива) является указателем.
Ответ 8
Фактически оценивается как:
Он правильно оценивает:
Это действительно не имеет особого отношения к размеру массивов явно. Я только что заметил много ошибок, не наблюдая, как работает препроцессор C. Вы всегда переносите параметр макроса, а не включаете в него выражение.
Это правильно; мой пример был плохим. Но это на самом деле то, что должно произойти. Как уже упоминалось ранее, p + 1 закончится как тип указателя и аннулирует весь макрос (как если бы вы попытались использовать макрос в функции с параметром указателя).
В конце дня, в данном конкретном случае, ошибка не имеет большого значения (поэтому я просто теряю время, huzzah!), потому что у вас нет выражений с типом «массива», Но на самом деле вопрос о тонкостях оценки препроцессора, я думаю, является важным.
Ответ 9
Для многомерных массивов это несколько сложнее. Часто люди определяют явные макроконстанты, т.е.
Но эти константы могут быть вычислены и во время компиляции с sizeof:
Обратите внимание, что этот код работает в C и С++. Для массивов с более чем двумя измерениями используйте
Ответ 10
Размер массива в C:
Ответ 11
Ответ 12
C ‘native’ массивы не сохраняют свой размер. Поэтому рекомендуется сохранять длину массива в отдельной переменной /const и передавать его всякий раз, когда вы передаете массив, а именно:
Вы ДОЛЖНЫ всегда избегать встроенных массивов (если только вы не можете, и в этом случае, обратите внимание на вашу ногу). Если вы пишете С++, используйте контейнер STL. «По сравнению с массивами они обеспечивают почти ту же производительность», и они гораздо полезнее!
Ответ 13
Ответ 14
@Магнус: стандарт определяет sizeof как уступающий количеству байтов в объекте, а sizeof (char) всегда один. Количество бит в байте является специфичным для реализации.
Изменить: стандартный раздел ANSI С++. 5.3.3. Размер:
Оператор sizeof дает количество байтов в представлении объекта своего операнда. [. ] sizeof (char), sizeof (подпись char) и sizeof (без знака char) равны 1; результат sizeof, применяемый к любому другому фундаментальному типу, определяется реализацией.
Раздел 1.6 Модель памяти С++:
Основным блоком памяти в модели памяти С++ является байт. Байт, по меньшей мере, достаточно большой, чтобы содержать любой элемент базового набора символов выполнения и состоит из непрерывной последовательности бит, число которых определяется реализацией.
Ответ 15
Википедия ошибается, Skizz прав. sizeof (char) равен 1, по определению.
Я имею в виду, просто внимательно прочитайте запись в Википедии, чтобы понять, что это неправильно. msgstr «кратные char». sizeof(char) никогда не может быть ничего, кроме «1». Если бы это было, скажем, 2, это означало бы, что sizeof(char) был в два раза меньше char!
Ответ 16
Я включил для вас какой-то код. Это не очень полезно, но вы можете расширить его с большим количеством функций. Если честно, если это то, что вы хотите, вы должны прекратить использовать C и использовать другой язык с этими встроенными функциями.
Ответ 17
Лучший способ сохранить эту информацию, например, в структуре:
Внедрите все необходимые функции, такие как создание, уничтожение, проверка равенства и все остальное, что вам нужно. Это легче передать в качестве параметра.
Ответ 18
Ответ 19
Ответ 20
Для более подробной информации смотрите здесь, а также здесь.
Как узнать размер массива переданного в функцию?
Необходимо определить размер массива, переданного в функцию. Пробовал вот так:
но в SIZE сохраняется 1, независимо от размера массива. Можно, конечно, вместе с массивом передать в функцию и его размер, но может существует более изящное решение?
P.S.: Кстати, заметил нечто странное. Запускал эту программу через Visual Studio и Qt. В VS в SIZE сохраняется 1, а в Qt 2.
1 ответ 1
У вас параметр функции foo объявлен как указатель типа int *
Следовательно внутри функции выражение
Но даже если вы объявите эту функцию как
все равно параметр функции неявно преобразуется в указатель на элемент массива. То есть эти два объявления функции объявляют одну и ту же функцию и эквивалетны следующему объявлению
Так что внутри функции вы снова будете иметь дело с указателем.
Когда массив передается по значению, то вам следует также объявлять второй параметр, который задает размер массива.
То есть в общем случае вам следует объявлять функцию как
Недостаток этого объявления состоит в том, что эта функция может иметь дело только с массивами, заданного в ее параметре размера.
Чтобы обойти это ограничение, вы можете объявить шаблонную функцию. Например,
В этом случае компилятор, используя шаблон, создаст столько функций, сколько массивов разной длины были использованы в качестве аргумента.
Как узнать размер динамического массива c
Шустрый
Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007
Репутация: нет
Всего: нет
Код |
int *ar; // указатель на элемент массива int size=100; |
ar=new int[size]; //Выделение памяти
memset(ar,0,size); //Инициализация
size = sizeof(ar); // выдает 4
delete[] ar; //Удаление
Похоже, что размер динамического массива узнать в C++, (у меня Borland C++) невозможно, и надо каждый раз передавать его размер как параметр. Это так?
Спасибо
Эксперт
Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006
Репутация: 2
Всего: 50
Добавлено через 34 секунды
В других случаях надо передавать размер массива.
Добавлено через 1 минуту и 5 секунд
depict1
Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина
Репутация: 29
Всего: 69
Цитата(TheDestroyer @ 2.4.2009, 13:04 ) |
и надо каждый раз передавать его размер как параметр |
один из способов избежать передачи размера в качестве отдельного параметра заключается в передачи пары итераторов на начало массива и на элемент после его конца.
ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы.
Эксперт
Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007
Репутация: 13
Всего: 41
Код |
int *ar; // указатель на элемент массива int size=100; ar=new int[size]; //Выделение памяти memset(ar,0,size); //Инициализация int size1=sizeof(int)*size; delete[] ar; |
Эксперт
Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006
Репутация: 2
Всего: 50
заверни свои данные в структуру и передавай ее в функцию
depict1
Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина
Репутация: 29
Всего: 69
любитель
Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006
Репутация: 79
Всего: 250
Цитата(zim22 @ 2.4.2009, 12:14 ) |
один из способов избежать передачи размера в качестве отдельного параметра заключается в передачи пары итераторов на начало массива и на элемент после его конца. ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы. |
uploading.
Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения
Репутация: 52
Всего: 211
Цитата |
ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы. |
Код |
template 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
uploading.
Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения
Репутация: 52
Всего: 211
по любому у этих методов полно недостатков, лучше передавать..либо в структуре, либо просто так..без разницы
Эксперт
Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург
Репутация: 5
Всего: 59
Цитата(mes @ 2.4.2009, 13:37 ) |
еще один : использовать std::vector и отградить себя от рутинной работы по контролю за динамическим массивом. |
depict1
Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина
Репутация: 29
Всего: 69
Цитата(TheDestroyer @ 2.4.2009, 13:04 ) |
Возможно ли узнать размер динамического массива? |
Код |
template 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 using namespace std; |
template
inline int arrlen(T *arr)
<
return static_cast (_msize(arr)/sizeof(T));
>
int main()
<
int *arr = new int[100];
Эксперт
Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007
Репутация: 13
Всего: 41
Цитата |
Т.к. если вы вдруг измените тип переменной size, то размер будет считаться неправильно. |
zim22, ты в этот раз не прав.
1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.
[ Время генерации скрипта: 0.1627 ] [ Использовано запросов: 21 ] [ GZIP включён ]
|