Определить размер массива, если он передан функции
Можно ли определить размер массива, если он был передан другой функции (размер не передан)? Массив инициализируется как int array [] = {XXX}..
Я понимаю, что делать sizeof невозможно, так как он вернет размер указателя. Причина, о которой я прошу, заключается в том, что мне нужно запустить цикл for внутри другой функции, где передается массив. Я попробовал что-то вроде:
for( int i = 0; array[i] != NULL; i++) {
........
}
Но я заметил, что в ближайшем конце массива массив [i] иногда содержит значения мусора, такие как 758433, который не является значением, указанным при инициализации массива.
Ответы
Ответ 1
В других ответах рассматривается одна особенность С++. Вы можете передавать массивы по ссылке и использовать шаблоны:
template <typename T, int N>
void func(T (&a) [N]) {
for (int i = 0; i < N; ++i) a[i] = T(); // reset all elements
}
вы можете сделать это:
int x[10];
func(x);
но заметьте, это работает только для массивов, а не указателей.
Однако, как отметили другие ответы, использование std::vector
- лучший выбор.
Ответ 2
Если он находится под вашим контролем, используйте контейнер STL, такой как вектор или deque, а не массив.
Ответ 3
Нет, это невозможно.
Один обходной путь: поместите последнее значение в значение последнего значения массива, чтобы вы могли его распознать.
Ответ 4
Одним из очевидных решений является использование STL. Если это не возможно, лучше передать длину массива явно.
Я скептически отношусь к трюку с доцентом, для этого конкретного случая. Оно работает лучше с массивами указателей, потому что NULL является хорошим значением для часового. С массив целых чисел, это не так просто - вам нужно иметь "волшебное" дозорное значение, которое нехорошо.
Примечание: если ваш массив определен и инициализирован как
int array[] = { X, Y, Z };
в той же области, что и ваш цикл, затем
sizeof (array) вернет реальный размер в байтах, а не размер указателя. Вы можете получить длину массива как
sizeof(array) / sizeof(array[0])
Однако, в общем случае, если вы получаете массив как указатель, вы не можете использовать этот трюк.
Ответ 5
Если вы не можете передать размер, в конце вам понадобится различающееся значение часового (и вам нужно поместить его там самим), как вы уже нашли, вы не можете доверять С++, чтобы сделать это автоматически вы!). Там нет способа просто вызвать вызываемую функцию магически божественным размером, если это не прошло, и нет явного, надежного сторожа в использовании.
Ответ 6
Вы можете добавить терминатор в свой массив int, а затем вручную пройти массив, чтобы узнать размер внутри метода.
#include<iostream>
using namespace std;
int howBigIsBareArray(int arr[]){
int counter = 0;
while (arr[counter] != NULL){
counter++;
}
return counter;
}
int main(){
int a1[6] = {1,2,3,4,5,'\0'};
cout << "SizeOfMyArray: " << howBigIsBareArray(a1);
}
Эта программа печатает:
SizeOfMyArray: 5
Это сложная операция времени O (n), которая является плохим. Вы никогда не должны проходить через массив, чтобы обнаружить его размер.
Ответ 7
Можете ли вы попробовать добавить нулевой символ \0
в массив, а затем отправить его? Таким образом, вы можете просто проверить \0 в цикле.
Ответ 8
На самом деле список Chucks
for (int я = 0; array [i]!= NULL; я ++) {
........
}
Размер перед каждым вызовом расточительный и необходим, чтобы знать, что вы получаете.
Отлично работает, если вы поместили NULL в конец массивов.
Почему?? Благодаря встроенным конструкциям, проходящим sizeof в каждой подпрограмме, каждый вызов очень большой по сравнению с NULL с каждым массивом. У меня есть чип 2K PIC16F684, и он занимает до 10 процентов чипа с 12 вызовами с использованием переданного sizeof вместе с массивом. Только с массивом и кодом Chucks с NULLS om для каждого массива... Мне нужно 4 процента.
Истинное дело в этом вопросе. Спасибо, чей хороший вызов.