我如何处理这种情况 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;
}
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;
}