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

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

  • автор:

Массив неизвестной длины в C #

Я только начал изучать С# и во введении к массивам они показали, как установить переменную как массив, но кажется, что нужно указать длину массива при назначении, так что, если я не знаю, длина массива?

10 ответов

Массиям должна быть назначена длина. Чтобы разрешить любое количество элементов, используйте класс List .

Используйте List<> для создания «массива» неизвестной длины.

Используйте List<>.ToArray() для возврата реального массива, а не List .

Вы можете создать массив с размером, установленным в переменной, т.е.

Однако этот размер не может измениться позже, если вы решите, что вам нужно 100 слов. Если вам нужно, чтобы размер был действительно динамичным, вам нужно использовать другую структуру данных. Попробуйте List .

Немного справочной информации:

Как сказано, если вы хотите иметь динамический набор вещей, используйте List<T> . Внутри List также использует массив для хранения. Этот массив имеет фиксированный размер, как и любой другой массив. Как только массив объявлен как имеющий размер, он не изменяется. Когда вы добавляете элемент в List , он добавляется в массив. Изначально List начинается с массива, который, как мне кажется, имеет длину 16. Когда вы пытаетесь добавить 17-й элемент в List , происходит то, что выделяется новый массив, который (я думаю) дважды размер старого, так что 32 элемента. Затем содержимое старого массива копируется в новый массив. Поэтому, хотя a List может показаться динамичным для внешнего наблюдателя, он также должен соблюдать правила.

И, как вы, возможно, догадались, копирование и распределение массивов не является бесплатным, поэтому нужно стремиться к тому, чтобы иметь как можно меньше из них, и сделать это, которое вы можете указать (в конструкторе List ), начальный размер массива, который в идеальном сценарии достаточно велик, чтобы держать все, что вы хотите. Однако это микро-оптимизация и маловероятно, что это будет иметь для вас значение, но всегда приятно знать, что вы делаете на самом деле.

Вы также можете посмотреть в словарях, если ваши данные уникальны. Это даст вам два столбца для работы.

Имя пользователя, Итоговый счет

он дает вам множество встроенных инструментов для поиска и обновления только значения.

Как создать массив с неизвестным количеством элементов

Вывести одномерный массив с неизвестным количеством элементов в listBox
Доброй ночи всем, кто не спит. Такое дело, нужно сравнить 2 матрицы и после равные соответствующие.

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

Массив с неизвестным количеством элементов
Как задать char массив, количество элементов которого мне неизвестно? Туда может быть записано 10.

Массив с неизвестным заранее количеством элементов
Задача: Создать программу, которая позволит ввести неограниченное количество значений и сохранит их.

Динамические массивы в C

Если вы используете относительно современный ЯП вроде JS, то массивы в С могут ввести вас в ступор.

Вступление

Массив в JavaScript:

Приведенный выше пример показывает, как бы мы создали массив в JS. Хорошо видно, что возможно добавить столько строк, сколько нам нужно.

Первое выражение numbers[3] говорит компилятору, что массив сохранит в памяти 3 числа. Далее сохраним 1,2 и 3 под соответствующими индексами и выведем на дисплей.
Пока все прекрасно, но но нельзя добавить ещё элементы:

И что на это скажет gcc ?:

Таким образом, мы получаем исключение за пределами границ памяти. Места в нашем массиве недостаточно, чтобы вместить ещё элементы.
Что же, если мы нуждаемся в динамическом массиве, в который можно добавить n элементов?

На С мы можем создать собственную имплементацию массива с динамически растущим размером.
Для этого используем блоки памяти.

malloc, realloc и указатели (pointers)

В С каждый тип данных имеет свой размер хранилища:

Тип Размер хранилища Диапазон значений
char 1 byte -128 до 127 или 0 до 255
unsigned char 1 byte 0 до 255
signed char 1 byte -128 до 127
int 2 или 4 bytes -32,768 до 32,767 или -2,147,483,648 до 2,147,483,647
unsigned int 2 или 4 bytes 0 до 65,535 или 0 до 4,294,967,295
short 2 bytes -32,768 to 32,767
unsigned short 2 bytes 0 до 65,535
long 8 bytes -9223372036854775808 до 9223372036854775807
unsigned long 8 bytes 0 до 18446744073709551615

В моей системе это 4 байта для целых чисел (integers). Просто имея эти данные можно создавать динамические массивы любого размера.
Размер типа данных можно получить при помощи функций sizeof(int), sizeof(double) или для тех типов данных, которые вам требуются.
Используя функции malloc и realloc мы можем создавать динамические блоки памяти.

Допустим, мы хотим начать с возможности хранить 3 целых числа (integers),это можно сделать, выделив блок памяти из 12 байт:

Теперь у нас есть блок памяти, достаточно большой, чтобы вместить наши 3 целых числа — нам нужно сделать его динамическим. Сейчас мы все ещё не можем поместить больше 3-х элементов в наш блок памяти.

Если отслеживать размер и объемом используемой памяти, можно рассчитать, когда нужно изменить ее размер. Если блок памяти заполнен, удвоим размер этого блока памяти, при помощи вызвова realloc , который просто расширяет текущий блок памяти.

Теперь есть возможность добавлять элементы в блок памяти динамически.
Собрав все это вместе, получим следующую программу:

Array of an unknown length in C#

I’ve just started learning C# and in the introduction to arrays they showed how to establish a variable as an array but is seems that one must specify the length of the array at assignment, so what if I don’t know the length of the array?

11 Answers 11

Arrays must be assigned a length. To allow for any number of elements, use the List class.

Use List<> to build up an ‘array’ of unknown length.

Use List<>.ToArray() to return a real array, and not a List .

skwear's user avatar

A little background information:

As said, if you want to have a dynamic collection of things, use a List<T> . Internally, a List uses an array for storage too. That array has a fixed size just like any other array. Once an array is declared as having a size, it doesn’t change. When you add an item to a List , it’s added to the array. Initially, the List starts out with an array that I believe has a length of 16. When you try to add the 17th item to the List , what happens is that a new array is allocated, that’s (I think) twice the size of the old one, so 32 items. Then the content of the old array is copied into the new array. So while a List may appear dynamic to the outside observer, internally it has to comply to the rules as well.

And as you might have guessed, the copying and allocation of the arrays isn’t free so one should aim to have as few of those as possible and to do that you can specify (in the constructor of List ) an initial size of the array, which in a perfect scenario is just big enough to hold everything you want. However, this is micro-optimization and it’s unlikely it will ever matter to you, but it’s always nice to know what you’re actually doing.

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

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