#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. Если вы хотите написать самостоятельно функцию, которая будет возвращать число элементов в массиве, то вам следует написать шаблонную функцию, в которой массив передается по ссылке. Например templatesize_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-разрядное приложение :)
Комментариев нет:
Отправить комментарий