2017-05-18 3 views
1

Ich versuche, eine Funktion zu erstellen, die Länge von Array bestimmt. Mein Code funktioniert nicht, bitte helfen!Wie ermitteln Array-Länge

#include <iostream> 

using namespace std; 

    int ArrayLength(int Array[]) 
    { 
     int i = 0; 
     while (Array[i] != NULL) 
     { 
      i++; 
     } 
     return i; 
    } 

int main(void) 
{ 
    int test[5] = { 4,5,6,7,1 }; 
    int testLen = ArrayLength(test); 
    cout << " test length = " << testLen; 

    return 0; 
} 
+0

Das ist nicht, wie Arrays arbeiten. Es gibt keine Garantie, dass das Element neben dem letzten NULL ist, im Gegenteil, es könnte alles sein. –

+0

Beim Lesen nach der Array-Länge ist der Wert nicht "0", sondern undefiniertes Verhalten. Es kann einen beliebigen Wert haben oder das Programm zum Absturz bringen. –

Antwort

0

Sie können Länge des Arrays finden diese

int testLen = (sizeof(test)/sizeof(*test)); 

Hoffnung mit, das hilft!

2

Ein Array ist nicht NULL terminiert, daher kann nicht davon ausgegangen werden, dass ein Endelement gleich NULL ist. Wenn ein Array an Ihre Funktion ArrayLength() übergeben wird, wird es in einen Zeiger auf das erste Array-Element mit allen Informationen über die Größe des verlorenen Arrays verfallen.

Um die Größe eines Arrays (kein Zeiger auf das erste Element) in Bytes zu erhalten, verwenden Sie den Operator sizeof().

int array[5] = {0,1,2,3,4}; 
static_assert(sizeof(array) == 5*sizeof(int),"!!"); 

Wenn Sie eine Funktion zu übernehmen array als Argument wollen und seine Größe zurückkehren, können Sie eine Vorlage erstellen:

template<typename T, size_t N> 
size_t ArrayLength(const T& [N]) 
{ return N; } 
2

Wenn ein Array von Wert übergeben wird implizit umgewandelt wird auf Zeiger seine erstes Element. Außerdem haben Arrays keinen Sentinel-Wert.

Die Funktion kann wie

template <size_t N> 
constexpr size_t ArrayLength(const int(&a)[N]) 
{ 
    return N; 
} 

Oder wie

template <class T, size_t N> 
constexpr size_t ArrayLength(const T(&a)[N]) 
{ 
    return N; 
} 

sind zu berücksichtigen, erklärt werden, dass es Standard-C++ Klasse ist std::extent in Header <type_traits> erklärt, der die Aufgabe hat.

Zum Beispiel

#include <iostream> 
#include <type_traits> 

int main() 
{ 
    int test[5] = { 4,5,6,7,1 }; 

    std::cout << std::extent<decltype(test)>() << std::endl; 
}