Я просто пытался получить количество элементов в целочисленном массиве. Ниже приведен код:
#include <iostream>
int unsorted[] = {9,8,7,6,5,4,3,2,1};
void PrintArrayAndSize(int arr[]);
int main(int argc, const char * argv[])
{
// insert code here...
long size = *(&unsorted + 1) - unsorted;
std::cout<<"no of elements = " << size <<"\n";//sizeof(int);
PrintArrayAndSize(unsorted);
return 0;
}
void PrintArrayAndSize(int arr[])
{
for(int i = 0 ; i < 9 ; i++)
std::cout<<arr[i]<<"\n";
long size = *(&arr + 1) - arr;
std::cout<<"no of elements = " << size <<"\n";//sizeof(int);
}
Ниже приведен вывод. Это тот же массив, но когда я вычисляю размер в main, я получаю правильный результат. Когда я передаю массив функции и вычисляю, я получаю другой результат.
количество элементов = 9
9 8 7 6 5 4 3 2 1
количество элементов = 35182156444984
Программа завершилась с кодом выхода: 0
Для аргументов массивы передаются как указатели (к первому элементу массива). Даже при использовании, например. int arr[]
. Компилятор обрабатывает это как int *arr
.
Это означает, что &arr
— это указатель к указателю, а не указатель на массив.
Если вы хотите, чтобы функция знала размер массива, вы всегда должны передавать его в качестве аргумента.
Или, поскольку вы используете C++, вы можете вместо простых массивов в стиле C использовать std::array
или std::vector
.
Или используйте шаблоны, чтобы иметь возможность передавать ссылку на массив с автоматическим выводом размера массива (что также можно использовать для std::array
).
Поэтому я предлагаю вам сделать что-то вроде
template<size_t N>
void PrintArrayAndSize(std::array<int, N> const& arr)
{
for (auto value : arr)
std::cout << value << '\n';
std::cout << "Array size is " << arr.size() << '\n';
}
int main()
{
std::array<int, 9> a = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
PrintArrayAndSize(a);
}
Нестандартное название переменной
unsorted
... она на самом деле отсортирована :)