Определить размер массива, если он передан функции

Можно ли определить размер массива, если он был передан другой функции (размер не передан)? Массив инициализируется как 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 процента.

Истинное дело в этом вопросе. Спасибо, чей хороший вызов.