#arrays #c
#массивы #c
Вопрос:
int a[10];
for(int i=0;i<5;i )
{
a[i]=i;
}
int len=sizeof(a)/sizeof(int);
print("%d",len);
Приведенный выше код выводит 10, но фактическое количество присутствующих элементов равно 5.
Нужна помощь.
Это не будет проблемой, если это массив символов, но здесь целочисленный массив вызывает боль.
Ответ №1:
Приведенный выше код выводит 10, но фактическое количество присутствующих элементов равно 5
Нет, фактическое количество элементов равно 10. Вы не вводили значение для его сохранения, это другое дело, но это не меняет размер массива.
Если вам нужно отслеживать используемые / эксплуатируемые элементы, вам нужно делать это самостоятельно, поддерживая где-нибудь счетчик.
В качестве альтернативы, если вы можете гарантировать, что
- Размер массива всегда равен максимальной требуемой длине 1
- Существует определенное значение, которое никогда не появится в списке допустимых значений
Вы можете использовать контрольное значение (аналогично нулевому терминатору в char
массиве), и с его помощью вы можете найти количество используемых элементов в массиве.
Комментарии:
1. О, привет! Большое спасибо! Использование чего-то аналогичного нулевому терминатору сделало бы работу.
2. @CRag Практически для всех целей ( включая строки! в основном) это плохое решение. Вместо этого лучше отслеживать длину. Вот почему практически все библиотеки обрабатывают это таким образом, вместо использования контрольных значений.
Ответ №2:
Вы объявили массив как:
int a[10];
Итак, количество элементов, зарезервированных в памяти, равно 10 (независимо от того, заполняете вы их или нет).
Если вы заинтересованы в сохранении количества элементов в массиве, я бы посоветовал вам заполнить его числом, которое вы все равно не будете использовать (в основном люди выбирают -1
для этой цели). Позже вы заполняете массив так, как вам нравится.
Таким образом, когда вы хотите узнать количество элементов в вашем массиве, вы просто просматриваете свой массив для первого -1
(если таковой имеется), индекс которого предоставит вам длину массива.
Ответ №3:
«Приведенный выше код выводит 10, но фактическое количество присутствующих элементов равно 5.«
Номер. -> int a[10];
-> a
— это массив 10
элементов типа int
.
Тот факт, что вы инициализируете только первые 5 элементов в for
цикле, не влияет на размер массива a
.
«Это не будет проблемой, если это массив символов, но здесь целочисленный массив вызывает боль.«
Это не может быть правдой, если ваш тестируемый код существенно не отличается. Возможно, используя strlen
вместо sizeof(a) / sizeof(char)
.
Ответ №4:
int a[10];
for(int i=0;i<5;i )
{
a[i]=i;
}
int len=sizeof(a)/sizeof(int);
print("%d",len);
Когда вы кодируете одну строку, вам нужно понять, почему вы так поступили
Вот небольшое объяснение по каждой строке.
int a[10];
Это объявление массива размером 10, и все элементы являются целыми числами.
Эта строка выделит 10 блоков памяти размером int для вашего массива с некоторыми случайными значениями (мусорными значениями).
Например, это выглядит так, как показано ниже.
|20|30|34|34|223|23|234|89|87|76|
for(int i=0; i<5; i ){
a[i] =i;
}
Это цикл for, который выполняется 5 раз от i = 0 до i = 4
где i-й элемент массива будет заменен на i значение.
При i = 0 первый элемент массива будет заменен на 0 с помощью этой строки
a[i] =i;
a[0] =0, когда i = 0
если a[0] заменить на i, то массив будет выглядеть следующим образом.
|0|30|34|34|223|23|234|89|87|76|
это продолжается до тех пор, пока i <5 для каждой итерации, массив будет изменяться, как показано ниже.
|0|1|34|34|223|23|234|89|87|76|
|0|1|2|34|223|23|234|89|87|76|
|0|1|2|3|223|23|234|89|87|76|
|0|1|2|3|4|23|234|89|87|76|
Вы можете ясно видеть, что размер массива не изменился. Остается 10