Possible Duplicates:
C++: sizeof for array length
Sizeof array passed as parameter
#include "stdafx.h"
#include <iostream>
using namespace std;
void PrintArrayLength(int arr[])
{
cout << "Function Array length is: " << sizeof(arr)/sizeof(int) << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
int arr[] = {1, 2, 3};
cout << "Array length is: " << sizeof(arr)/sizeof(int) << endl; // print 3
PrintArrayLength(arr); // print 1
return 0;
}
为什么一个地方 sizeof(arr)/sizeof(int) 的值为 1 而另一个地方的值为 3?
因为当您按值将数组传递给函数时,实际上是在传递一个指针(指向数组的第一个元素)。
void PrintArrayLength(int arr[])
{
cout << "Function Array length is: " << sizeof(arr)/sizeof(int) << endl;
}
是实际上:
void PrintArrayLength(int* arr)
{
cout << "Function Array length is: " << sizeof(arr)/sizeof(int) << endl;
}
不要被允许将数组声明为 int[]
的语法糖所误导。实际上,没有这样的类型,你真正写的是:
int arr[3] = {1, 2, 3};
只是编译器可以从初始化程序中为您简单地填充 3
。
顺便说一句,如果您通过引用传递数组,您可以保留维度。为方便起见,您可以使用模板,这样无论数组的维度如何(因为维度是类型的一部分)您都只需要一个函数:
template <size_t N>
void PrintArrayLength(int (&arr)[N])
{
cout << "Function Array length is: " << sizeof(arr)/sizeof(int) << endl;
}
对此的一个扩展是不使用sizeof
的好建议。您很容易落入您曾经落入的陷阱,认为您正在估量一个数组,而实际上您并没有。改用这个:
template <typename T, size_t N>
size_t length_of_array(T (&)[N]) {
return N;
}
尝试在除正确数组之外的任何对象上使用此函数将失败并出现编译器错误,而不是像您的代码那样默默地提供误导性值。
当然,用 boost::array
(或 C++0x 中的 std::array
)或什至 std::vector
(可以调整大小)是最好的方法。 :)