Получение разных результатов при вычислении количества элементов при передаче целочисленного массива в функцию

Я просто пытался получить количество элементов в целочисленном массиве. Ниже приведен код:

#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

Нестандартное название переменной unsorted... она на самом деле отсортирована :)

lubgr 10.04.2019 09:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для аргументов массивы передаются как указатели (к первому элементу массива). Даже при использовании, например. 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);
}

Другие вопросы по теме

Как предотвратить многократный выбор одной и той же опции/значения в операторе switch
При использовании std::vector::push_back для вставки неизвестного количества элементов следует ли проверять std::vector::max_size при каждом нажатии?
Преобразование статического массива constexpr в параметр шаблона в С++ 11
Очень странная ошибка при попытке напечатать шестнадцатеричный хеш Blake2 файла
Как проверить дескриптор USB HID как недействительный из-за повторного подключения устройства
Перемещение функции из консольного приложения в проект общей библиотеки, похоже, приводит к несвязанной ошибке компиляции
Символ 'T' не разрешается в строке после ключевого слова шаблона
Как использовать массивы сложных переменных в C++?
Как записать данные в стандартный ввод для использования отдельным потоком, ожидающим ввода из стандартного ввода?
Состояние гонки 2 чередующихся потока