Bestimmen Sie die Größe des Arrays, wenn es an die Funktion übergeben wird

Lesezeit: 7 Minuten

Ist es möglich, die Größe eines Arrays zu bestimmen, wenn es an eine andere Funktion übergeben wurde (Größe wird nicht übergeben)? Das Array wird wie ein int-Array initialisiert[] = {XXX} ..

Ich verstehe, dass es nicht möglich ist, sizeof auszuführen, da es die Größe des Zeigers zurückgibt. Der Grund, warum ich frage, ist, dass ich eine for-Schleife innerhalb der anderen Funktion ausführen muss, an der das Array übergeben wird. Ich habe so etwas versucht:

for( int i = 0; array[i] != NULL; i++) {
........
}

Aber ich bemerkte das am nahen Ende des Arrays, Array[i] enthalten manchmal Müllwerte wie 758433, was kein Wert ist, der bei der Initialisierung des Arrays angegeben wurde.

  • Verwandte Frage, die auch Demonstrationen dazu enthält: Wenn eine Funktion einen Array-Parameter mit einer bestimmten Größe hat, warum wird er durch einen Zeiger ersetzt?

    – Gabriel Staples

    24. September 2020 um 21:15 Uhr


Die anderen Antworten übersehen ein Feature von c++. Sie können Arrays als Referenz übergeben und Vorlagen verwenden:

template <typename T, int N>
void func(T (&a) [N]) {
    for (int i = 0; i < N; ++i) a[i] = T(); // reset all elements
}

dann kannst du das machen:

int x[10];
func(x);

Beachten Sie jedoch, dass dies nur für funktioniert Arrayskeine Zeiger.

Wie andere Antworten jedoch angemerkt haben, verwenden Sie std::vector ist eine bessere Wahl.

  • +1 Dies ist eine Art Lösung, erstellt jedoch ein anderes func () -Symbol für jede unterschiedliche Arraygröße. Das heißt, an verschiedenen Stellen hat das übergebene Array unterschiedliche Größen, die Funktion wird so oft instanziiert. Dies könnte jedoch hilfreich sein, um die Größe des Arrays in einen Aufruf einer anderen Funktion einzufügen, die die tatsächliche Implementierung hat und die Größe erhält, wobei sie wahrscheinlich als Inline gekennzeichnet wird (nicht, dass der Compiler Ihrer Regel folgen muss …) template Inline-Void-Wrapper (T (&a)[N] ) { return func( a, N ); } — wobei func() die eigentliche Funktion ist.

    – David Rodríguez – Dribeas

    9. Juni 2009 um 6:17 Uhr

  • Natürlich wäre das Ziel, die Funktion, die darauf operiert, so klein zu machen, dass sie wahrscheinlich inliniert wird. Auch deine Wrapper-Idee gefällt mir.

    – Evan Teran

    9. Juni 2009 um 14:18 Uhr

  • @Anakhand: sollte den Vorlagenparameter N explizit angeben, da er nicht abgeleitet werden kann: max_(foo);

    – jimifiki

    11. Oktober 2019 um 12:14 Uhr

  • Ich habe gerade ein weiteres, längeres Beispiel mit einigen Vergleichen hier hinzugefügt: stackoverflow.com/a/64054579/4561887

    – Gabriel Staples

    24. September 2020 um 21:22 Uhr

Wenn es in Ihrer Kontrolle liegt, verwenden Sie einen STL-Container wie einen Vektor oder eine Deque anstelle eines Arrays.

  • Einverstanden. Wenn Sie sich mit Vektoren nicht auskennen, ist jetzt eine großartige Zeit, es zu lernen! Es wird Ihr Leben viel einfacher machen.

    – rlbond

    9. Juni 2009 um 3:53 Uhr

Nein, es ist nicht möglich.

Eine Problemumgehung: Platzieren Sie einen speziellen Wert am letzten Wert des Arrays, damit Sie ihn erkennen können.

  • … und bereiten Sie sich darauf vor, die Fälle zu debuggen, in denen jemand diesen speziellen Wert in die Mitte des Arrays platziert. Mit anderen Worten: Tu es nicht. Wie andere sagten: Verwenden Sie gut definierte Container (z. B. STL) oder übergeben Sie die Größe des Arrays zusammen mit ihm als anderen Parameter der Funktion

    – Rom

    9. Juni 2009 um 4:28 Uhr

  • Es gibt nur einen sinnvollen Grund, spezielle Werte am Ende des Arrays zu verwenden: Parameter mit variabler Länge in Funktionen. Aber auch in diesem Fall wird die Angabe der Größe des Eingabearrays bevorzugt.

    – Zabulus

    24. Juni 2011 um 13:25 Uhr

  • Wenn man erwägt, die Länge innerhalb des Arrays zu speichern, würde ich diesen speziellen Wert (Länge des Arrays) am Anfang des Arrays übergeben und den Zeiger auf diesen Zeiger erhöhen[-1] ist immer dieser Längenwert. Dieses Konzept wird meines Wissens intern von Microsoft Windows BSTR verwendet (siehe SysAllocString). Wenn Sie mit einem Array von Zeichenfolgen arbeiten, gibt es eine andere mögliche Lösung. Das Ende des Arrays wird mit einem doppelten NULL-Zeichen am Ende des Arrays bestimmt.

    – bkausbk

    22. Juli 2013 um 12:11 Uhr


Bestimmen Sie die Grose des Arrays wenn es an die
Igor Kriwokon

Eine offensichtliche Lösung ist die Verwendung von STL. Wenn dies nicht möglich ist, ist es besser, die Arraylänge explizit zu übergeben. Ich bin skeptisch gegenüber der Verwendung des Sentinel-Wert-Tricks für diesen speziellen Fall. Es funktioniert besser mit Arrays von Zeigern, da NULL ein guter Wert für einen Wächter ist. Mit einem Array aus ganzen Zahlen ist es nicht so einfach – Sie brauchen einen “magischen” Sentinel-Wert, was nicht gut ist.

Randnotiz: Wenn Ihr Array definiert und initialisiert ist als

 int array[] = { X, Y, Z };

dann im selben Umfang wie Ihre Schleife

sizeof(array) gibt seine tatsächliche Größe in Bytes zurück, nicht die Größe des Zeigers. Sie können die Array-Länge als erhalten

sizeof(array) / sizeof(array[0])

Wenn Sie jedoch ein Array als Zeiger erhalten, können Sie diesen Trick im Allgemeinen nicht verwenden.

Bestimmen Sie die Grose des Arrays wenn es an die
Ali

Sie könnten Ihrem int-Array ein Abschlusszeichen hinzufügen und dann manuell durch das Array gehen, um die Größe innerhalb der Methode zu ermitteln.

#include<iostream>
using namespace std;

int howBigIsBareArray(int arr[]){
    int counter = 0;
    while (arr[counter] != NULL){
        counter++;
    }
    return counter;
}
int main(){
    int a1[6] = {1,2,3,4,5,'\0'};
    cout << "SizeOfMyArray: " << howBigIsBareArray(a1);
}

Dieses Programm druckt:

SizeOfMyArray: 5

Dies ist eine O(n)-Zeitkomplexitätsoperation, die schlecht ist. Sie sollten niemals durch ein Array gehen, nur um seine Größe zu entdecken.

  • Ich stimme @Eric Leschinski zu, aber heutzutage werden Sie bei jedem Programmierwettbewerb aufgefordert, den Funktionsprototyp nur auf diese Weise zu schreiben. Seit anderen Sprachen wie Java hat C# eine Möglichkeit, die Größe zu finden. Ich denke, Alis Antwort ist perfekt. Zum Beispiel, codeyourwayin.topcoder.com/arena Sie erwähnten, dass der Prototyp für verschiedene Sprachen gleich sei.

    – siddhushingh

    25. Oktober 2014 um 10:19 Uhr


  • Sie müssen nur sicherstellen, dass das Array keine Nullen enthält, da das Abschlusszeichen mit Null ausgewertet wird

    – Nav

    30. April 2015 um 6:24 Uhr

  • -1 für Übergeneralisierung: “Sie sollten niemals durch ein Array gehen, nur um seine Größe zu entdecken.” Noch nie? Wie funktioniert Strlen Ihrer Meinung nach?

    – Spike0xff

    22. Juni 2016 um 15:51 Uhr

  • Oder, wenn Sie diese Stelle als Zählung am Anfang des Arrays anstelle des Endes verwenden, würde dies zu O (1) anstelle von O (N) werden. Logischerweise kann es damit verglichen werden, die Informationen über ein Paket in den Headern aufzubewahren.

    – Anthony Pace

    2. Februar 2020 um 1:29 Uhr

1646964613 522 Bestimmen Sie die Grose des Arrays wenn es an die
Alex Martell

Wenn Sie die Größe nicht weitergeben können, benötigen Sie eine unterscheidbare Wächter -Wert am Ende (und Sie müssen ihn selbst dort einfügen — wie Sie festgestellt haben, können Sie C++ nicht vertrauen, dass er dies automatisch für Sie erledigt!). Es gibt keine Möglichkeit, die aufgerufene Funktion einfach auf magische Weise die Größe erraten zu lassen, wenn diese nicht übergeben wird und kein expliziter, zuverlässiger Wächter verwendet wird.

  • Ich stimme @Eric Leschinski zu, aber heutzutage werden Sie bei jedem Programmierwettbewerb aufgefordert, den Funktionsprototyp nur auf diese Weise zu schreiben. Seit anderen Sprachen wie Java hat C# eine Möglichkeit, die Größe zu finden. Ich denke, Alis Antwort ist perfekt. Zum Beispiel, codeyourwayin.topcoder.com/arena Sie erwähnten, dass der Prototyp für verschiedene Sprachen gleich sei.

    – siddhushingh

    25. Oktober 2014 um 10:19 Uhr


  • Sie müssen nur sicherstellen, dass das Array keine Nullen enthält, da das Abschlusszeichen mit Null ausgewertet wird

    – Nav

    30. April 2015 um 6:24 Uhr

  • -1 für Übergeneralisierung: “Sie sollten niemals durch ein Array gehen, nur um seine Größe zu entdecken.” Noch nie? Wie funktioniert Strlen Ihrer Meinung nach?

    – Spike0xff

    22. Juni 2016 um 15:51 Uhr

  • Oder, wenn Sie diese Stelle als Zählung am Anfang des Arrays anstelle des Endes verwenden, würde dies zu O (1) anstelle von O (N) werden. Logischerweise kann es damit verglichen werden, die Informationen über ein Paket in den Headern aufzubewahren.

    – Anthony Pace

    2. Februar 2020 um 1:29 Uhr

Bestimmen Sie die Grose des Arrays wenn es an die
Alan Haggai Alavi

Können Sie versuchen, ein Nullzeichen anzuhängen \0 an das Array und senden Sie es dann? Auf diese Weise können Sie in der Schleife einfach nach \0 suchen.

989580cookie-checkBestimmen Sie die Größe des Arrays, wenn es an die Funktion übergeben wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy