как узнать длину динамического массива 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++), но, например, в Java это можно сделать с помощью метода length, а на c++ как это можно реализовать?
Следует учесть, что массивы могут быть и двумерными.
Заранее благодарен за любую помощь!
10 ответов
НО. _msize возвращает значение только для памяти выделенной с помощью malloc(), а как быть с оператором new?
ЗЫ : А если код такой
Обсасываем проблему высосанную из пальца?
Если сам создал массив, значит должен и длину знать.
Если мучает склероз, сохрани длину в соотв. переменной, рядом с массивом.
Какие проблемы? В чем сложность? Зачем делать простые вещи через задние проходы?
Тут кстати, поблизости есть тема, о пользе контейнеров:)
мне нужно написать одну программку, но в ней массивы вида m[a][c]. причем a,b,c каждый раз разные, и подобных массивов очень много создается по ходу работы программы.
Вот я и решил что проще узнавать как-то размер блока памяти по указателю на него, чем хранить где-то количество элементов в таких массивах.
Вариант с контейнерами хорош конечно, но мне нужно быстродействие.
Всем спасибо за советы, вопрос исчерпан.
Как узнать размер массива переданного в функцию?
Необходимо определить размер массива, переданного в функцию. Пробовал вот так:
но в SIZE сохраняется 1, независимо от размера массива. Можно, конечно, вместе с массивом передать в функцию и его размер, но может существует более изящное решение?
P.S.: Кстати, заметил нечто странное. Запускал эту программу через Visual Studio и Qt. В VS в SIZE сохраняется 1, а в Qt 2.
1 ответ 1
У вас параметр функции foo объявлен как указатель типа int *
Следовательно внутри функции выражение
Но даже если вы объявите эту функцию как
все равно параметр функции неявно преобразуется в указатель на элемент массива. То есть эти два объявления функции объявляют одну и ту же функцию и эквивалетны следующему объявлению
Так что внутри функции вы снова будете иметь дело с указателем.
Когда массив передается по значению, то вам следует также объявлять второй параметр, который задает размер массива.
То есть в общем случае вам следует объявлять функцию как
Недостаток этого объявления состоит в том, что эта функция может иметь дело только с массивами, заданного в ее параметре размера.
Чтобы обойти это ограничение, вы можете объявить шаблонную функцию. Например,
В этом случае компилятор, используя шаблон, создаст столько функций, сколько массивов разной длины были использованы в качестве аргумента.
Как определить размер моего массива в 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
Для более подробной информации смотрите здесь, а также здесь.