2015-12-31 17 views
1

我还在学习C++。目前我正在学习数组,并希望获得数组的长度。我知道要得到一个阵列的长度,我必须输入:C++ - 获取数组长度的GetLength()方法

int length = (sizeof(array)/sizeof(*array)); 

它工作得很好。但是,当我创建一个方法来获取我命名为getLength()的长度时,它不起作用。在这里我的代码:

#include <iostream> 
using namespace std; 

int array[5] = {1,2,3,4,5}; 

int getLength(int arg[]){ 
    return(sizeof(arg)/sizeof(*arg)); 
} 

int main(){ 
    //array length 
    cout << "Displaying array length" << endl; 
    cout << getLength(array) << endl; 
    system("pause"); 
} 

这应该返回5,但它返回1.如果我用以前的方式,它返回5,即使他们有相同的代码。

感谢您的帮助。

+0

另外:http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c“5.3陷阱”特别是。 – user2079303

+1

所有*你的“如何在C++中使用数组”的答案是**不要**。真。使用std :: vector。 –

+0

一种方法是使用模板非类型参数来推断数组大小,如[std :: end does it](http://stackoverflow.com/a/33496357/1708801)。 –

回答

1

这是因为array腐朽当它传递到getLength时指针类型。

所以在该函数中,sizeof不能用于检索数组的总大小;它仅仅评估指向第一个元素的指针的大小。

在这种情况下,正常的做法是将尺寸值传递给getLength作为参数。

1

因为当你将数组传递给函数时,数组会衰变为一个指针。因此sizeof(arg)将返回您的架构上指针的大小。如果你需要大小,你需要传递一个额外的参数给函数。 检查:What is array decaying?

+0

所以我不能使用函数来获得长度。谢谢你的解释 :)。我会继续我的学习。 – Sena

0

当您使用数组调用函数时,数组将衰减到指向第一个元素的指针。数组语法颇具误导性。下面的两个功能是相同的:

void func1(int* p) { /* do something */ } 
void func2(int p[]) { /* do something */ } 

详见this stack overflow answer

你可以做的是钻研模板。下面是不工作的函数:

template <typename T, size_t N> 
size_t array_length(T (&arr)[N]) 
{ 
    return N; 
} 

模板捕获由参考阵列(arr)和大小(N)由模板匹配已知的。您的main()示例可以使用它。尽管如此,我认为使用std::vector<>std::array<>代替它会好很多。与这些,大小是平凡的访问,你会得到其他愉快的属性,不仅如此,他们不衰减指针。