首页 > 解决方案 > 为什么我在主函数和其他函数中看到不同的数组大小值

问题描述

我创建了一个由十个整数组成的数组,并在 main 2. 中打印它的大小 1. 在一个名为 print 的函数中

#include <iostream>
using namespace std;
void print(int *a)
{
    cout<<sizeof(a);
}
int main()
{
    int arr[10];
    cout<<sizeof(arr)<<endl;
    print(arr);
}

输出是:

40

8

在这两种情况下我都期望 40 (作为 1 integer=4 乘以 10 的大小),但第二种情况显示单个指针的大小而不是整个数组的大小。这里发生了什么事?

标签: c++pointerspass-by-referenceimplicit-conversionpass-by-value

解决方案


从函数声明中可以看出

void print(int *a)
{
    cout<<sizeof(a);
}

该函数处理指针。所以这个说法

cout<<sizeof(a);

根据使用的系统,输出等于 4 或 8 字节的指针大小。

请注意,即使您将声明函数

void print(int a[])
{
    cout<<sizeof(a);
}

您将得到相同的结果,因为编译器将参数隐式调整为 int * 类型。

也就是前面和这个函数声明是等价的。

如果您希望该函数处理原始数组而不是指向作为参数传递的数组的第一个元素的指针,那么至少声明该函数。

void print( int ( &a )[10] )
{
    cout<<sizeof(a);
}

那就是将参数声明为引用。

或者您可以将函数设为模板函数,例如

template <size_t N>
void print( int ( &a )[N] )
{
    cout<<sizeof(a);
}

由于传递的数组在函数中没有被更改,因此参数应该具有限定符 const

template <size_t N>
void print( const int ( &a )[N] )
{
    cout<<sizeof(a);
}

这是一个演示程序。

#include <iostream>

template <size_t N>
void print( const int ( &a )[N] )
{
    std::cout << sizeof( a ) << '\n';
}

int main() 
{
    int arr[10];

    std::cout << sizeof( arr ) << '\n';

    print( arr );

    return 0;
}

它的输出是

40
40

或者您可以使用类型模板参数定义模板函数。但同样,函数参数具有引用类型。

#include <iostream>

template <typename T>
void print( const T &a )
{
    std::cout << sizeof( a ) << '\n';
}

int main() 
{
    int arr[10];

    std::cout << sizeof( arr ) << '\n';

    print( arr );

    return 0;
}

程序输出将与上图相同。


推荐阅读