Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Некорректный вывод размерности массива в функции [дубликат]

#cpp #массивы #sizeof


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Передача статического одномерного массива определённого
размера в функцию
                                
                                    (6 ответов)
                                
                        
                                Закрыт 3 года назад.
            
                    
Уважаемые коллеги! 

Компилятор меня не понимает. Общеизвестно, что размерность массива int size = (sizeof(b)
/ sizeof(*b));Где, b - некоторый массив. Так вот в примере ниже я получаю размерность
массива вынося эту команду в отдельную функцию и выполняя эту команду в main:

#include "stdafx.h"
#include 
#include   

using namespace std;

//Функция которая считает и печатает размерность массива.
void ArrLength(int a[]) {
    int j = (sizeof(a) / sizeof(*a));; //определяем размерность массива
    cout << "Размерность массива в функции ArrLength = " << j << endl; 
}

int main()
{
    setlocale(LC_ALL, "Russian");

    int b[] =  {3, 5, 8, 3, 0, 32, 18, 65}; //объявление некоторого массива
    int size = (sizeof(b) / sizeof(*b)); //выяснение размерности некоторого массива 
    cout << "Размерность массива size = " << size << endl;
    ArrLength(b);

    system("PAUSE");
    return 0;
}


К моему глубочайшему удивлению, распечатывает:

Размерность массива size = 8
Размерность массива в функции ArrLength = 2


То есть, даёт два различных ответа. И если с первым я готов согласиться, то второй
кажется мне явно ошибочным. 

Вопрос: чем можно объяснить наблюдаемое поведение? 
    


Ответы

Ответ 1



Параметры функции, объявленные как массивы, неявно упорядочиваются в указатели на типы элементов массивов. Поэтому следующие объявления функции void ArrLength(int a[]); void ArrLength(int a[100]); void ArrLength(int *a); Эквивалентны и объявляют одну и туже функцию, параметром которой будет указатель типа int *. Вы все эти объявления можете одновременно включить в программу, так как одну и ту же функцию можно объявлять (в отличии от определения функции) несколько раз. Поэтому внутри этой функции void ArrLength(int a[]) { int j = (sizeof(a) / sizeof(*a));; //определяем размерность массива cout << "Размерность массива в функции ArrLength = " << j << endl; } параметр функции a имеет тип int * и выражение sizeof(a) / sizeof(*a) эквивалентно выражению sizeof( int * ) / sizeof( int ) и в зависимости от платформы будет равно либо 2 либо 1. Если вы хотите написать самостоятельно функцию, которая будет возвращать число элементов в массиве, то вам следует написать шаблонную функцию, в которой массив передается по ссылке. Например template size_t ArrLength( const T (&a)[N] ) { return N; } В С++ вы можете воспользоваться структурой std::extent для получения количества элементов в массиве. Например, #include #include int main() { int a[4][6]; std::cout << std::extent::value << std::endl; std::cout << std::extent::value << std::endl; } Вывод программы на консоль 4 6

Ответ 2



Тем, что при передаче в функцию массив неявно приводится к указателю. Так что вы пытаетесь выяснить sizeof(int*)/sizeof(int). Кстати, сразу видно, что вы создаете 64-разрядное приложение :)

Комментариев нет:

Отправить комментарий