Подтвердить что ты не робот

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

Можно ли определить размер массива, если он был передан другой функции (размер не передан)? Массив инициализируется как int array [] = {XXX}..

Я понимаю, что делать sizeof невозможно, так как он вернет размер указателя. Причина, о которой я прошу, заключается в том, что мне нужно запустить цикл for внутри другой функции, где передается массив. Я попробовал что-то вроде:

for( int i = 0; array[i] != NULL; i++) {
........
}

Но я заметил, что в ближайшем конце массива массив [i] иногда содержит значения мусора, такие как 758433, который не является значением, указанным при инициализации массива.

4b9b3361

Ответ 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 процента.

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