我如何处理这种情况 C++ sizeof 问题

How do i handle this situation C++ sizeof problem

void f(int* b[])
{
    cout << sizeof(*b) << endl;
}

int main()
{
    int x[4] = {1, 2, 3, 4};
    int* a[] = {&x[0], &x[1], &x[2], &x[3]};

    cout << sizeof(a) << endl;

    f(a);
}

程序先输出32(在main中) 和 8(在函数中)

我该如何处理这种情况?

您可以通过使用 size_t 类型传递数组中元素的数量来处理这种情况。

一旦数组被传递给一个函数,它衰减指向第一个元素的指针。所有大小信息都丢失了。 sizeof 是一个奇怪的运算符,因为指针衰减不适用于其参数,这导致了输出的差异。

如果我没理解错的话,你是在尝试获取函数中传递的数组的大小。

按以下方式进行

template <size_t N>
void f( int* ( &b )[N] )
{
    cout << sizeof( b ) << endl;
}

在 C 中,您应该使用一个多参数声明函数,例如

void f(int* b[], size_t n )
{
    printf( "%zu\n", n * sizeof( *b ) );
}

并这样称呼它

f(a, sizeof( a ) / sizeof( *a ) );

您也可以在 C++ 中使用这种方法。

数组退化为指针。这就是问题的原因。解决方法如下。通过引用传递数组:

template <typename T>
void f(T &b) {
  std::cout << sizeof(b) << std::endl;
}