2015-12-31 5 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 Pitfall" в частности. – user2079303

+1

Ответ на * все * ваши «как использовать массивы в C++» ** не **. В самом деле. Используйте std :: vector. –

+0

Один из способов сделать это, как [std :: end does it] (http://stackoverflow.com/a/33496357/1708801), используя шаблонный параметр типа non-type для вывода размера массива. –

ответ

1

Это потому, что array имеет разложил на указательный тип, когда он перешел на getLength.

В этой функции sizeof не может использоваться для извлечения общего размера массива; он просто оценивает размер указателя на первый элемент.

Нормальная вещь в этом случае - передать значение размера в getLength в качестве параметра.

1

Потому что, когда вы передаете массив функции, массив распадается на указатель. Таким образом, sizeof(arg) вернет размер указателя на вашу архитектуру. Если вам нужен размер, вам нужно будет передать дополнительный параметр функции. Check: 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<>. С ними размер тривиально доступен, и вы получаете другие приятные свойства, не в последнюю очередь, что они не распадаются на указатели.

Смежные вопросы