返回数组大小的函数总是返回2

时间:2013-12-08 22:25:30

标签: c++ arrays function return

我通过在数组上编写函数来刷新我的 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.任何人都知道怎么了?

4 个答案:

答案 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 ++通过引用传递数组,因此你只是将地址大小分开。