我通过在数组上编写函数来刷新我的 C ++ (使用eclipse和cygwin)。 我有以下代码:
int getArraySize(int a[]){
int size = sizeof(a)/sizeof(a[0]);
return size;
}
int main(void) {
int arr[5] = {0, 1, 2, 3, 4};
string s = "size of array: ";
cout << s << getArraySize(arr) << endl;
cout << s << sizeof(arr)/sizeof(arr[0]) << endl;
return EXIT_SUCCESS;
}
我希望得到这个输出:
size of array: 5
size of array: 5
但我得到了这个:
size of array: 2
size of array: 5
我用其他大小的数组和函数getArraySize()
尝试过这个程序
永远都会回来2.任何人都知道怎么了?
答案 0 :(得分:3)
这看起来像一个数组声明,但它不是:
int getArraySize(int a[]){
这只是一个指向int的指针。因此sizeof(a) / sizeof(a[0])
只会给出指针大小和指向事物大小之间的比率。如果在括号之间放置一个数字,情况不会改变,如下所示:
int getArraySize(int a[5]){
对于C ++编译器,它与int getArraySize(int *a)
相同。 C ++不按值传递数组。它传递一个指向数组第一个元素的指针。当您给出数组参数时,参数会衰减为指针。
当{em>实际数组变量传递给它时,sizeof()
运算符将给出数组中的总字节数,如下所示:
int arr[5] = {0, 1, 2, 3, 4};
int arr_size = sizeof(arr) / sizeof(arr[0]);
答案 1 :(得分:1)
不幸的是,这里的C ++语法有点误导。
您无法将数组传递给C ++函数,只能将指针传递给第一个元素。
在C ++中声明
void foo(int x[])
与
完全相同void foo(int *x)
即使您在
中放置括号之间的大小void foo(int x[10])
数字10
不是语法错误,但会被完全忽略。
然而,您使用一种奇怪的语法从模板函数推断数组大小:
template<typename T, size_t N>
size_t ArraySize(T (&)[N])
{
return N;
}
sizeof(x)/sizeof(x[0])
技巧只有在宏中使用时才有效...它不能放在函数中。
答案 2 :(得分:0)
你的大小是int a[]
,这实际上是一个指针
看起来你在 64位机器上所以:
sizeof(64 bit pointer) = 8
sizeof (int) = 4
8/4 = 2
在32位机器上,您将获得1
问题是你没有达到arr
的大小,在c ++ 11之前你真的没有办法做到这一点,你可以使用std::array
代替
答案 3 :(得分:0)
我认为你的问题是c ++通过引用传递数组,因此你只是将地址大小分开。