Frage Wie man die Länge der dynamisch zugewiesenen zweidimensionalen Arrays in C erhält


Die Frage ist, wie man die Länge von dynamisch zugewiesenen 2D-Arrays in C erhält? Ich dachte, dass der Code unten die Anzahl der Zeilen erhalten sollte, aber das tut es nicht.

char** lines;
/* memory allocation and data manipulation */

int length; //the number of rows

length = sizeof(lines)/sizeof(char*);

Irgendwelche Gedanken dazu?


5
2017-09-12 03:48


Ursprung


Antworten:


Die Länge der dynamisch zugewiesenen Arrays in C (2D oder anders) kann nicht ermittelt werden. Wenn Sie diese Informationen benötigen, speichern Sie sie in einer Variablen (oder zumindest auf eine Weise, sie zu berechnen), wenn der Speicher anfänglich zugeordnet ist, und übergeben Sie den Zeiger an den Speicher und die Größe des Speichers herum.

In Ihrem Testfall oben sizeof gibt die Größe des Typs von zurück linesund damit entspricht Ihre Längenberechnung sizeof(char**)/sizeof(char*) und hat wahrscheinlich das triviale Ergebnis von 1, immer.


6
2017-09-12 03:51



Die zugrunde liegende Implementierung von malloc oder new muss zwangsläufig die Größe des für Ihre Variable zugewiesenen Speichers verfolgen. Leider gibt es keinen Standardweg, um die Größe des zugewiesenen Blocks zu erhalten. Der Grund liegt in der Tatsache, dass nicht alle Speicherblöcke dynamisch zugewiesen sind, so dass die Funktion, die nur für die dynamische Zuweisung funktioniert, nicht so nützlich ist.

void fillwithzero(int* array) {
    unsigned int size = getsize(array); // return 0 for statically allocated array ??
    for(int i = 0; i < size; i++) {
        array[i] = 0;
    }
}

Sagen wir, wir haben es getsize Funktion, die magischerweise die Größe des dynamisch zugewiesenen Arrays erhalten kann. Wenn Sie jedoch einen Zeiger eines statischen Arrays oder eines Arrays senden, das durch andere Mittel (z. B. externe Funktion) zugewiesen wurde fillwithzero, diese Funktion wird nicht funktionieren. Das ist der Grund, warum die meisten C-Funktionen, die Arrays akzeptieren, vom Aufrufer benötigt wurden, um die Größe oder die maximale Größe des Arrays zusammen mit dem Array selbst zu senden.


2
2017-09-12 05:25



Sie können die Größe eines dynamisch zugewiesenen Arrays nicht finden. Wenn Sie dieses Array an eine Funktion übergeben müssen, erstellen Sie eine Struktur, die das Array und seine Größe enthält.

struct Line {
    char** text;
    uint32_t size;
};

2
2017-09-12 04:35



Sie können die Länge eines dynamisch zugewiesenen Arrays in C nicht ermitteln.

Wenn Sie es zuweisen, müssen Sie diese Länge irgendwo speichern, damit Sie wissen, wie lange es ist.

Zum Beispiel:

int length = ...;
lines = malloc(length*sizeof(char*));

Wenn Sie dies an andere Funktionen weitergeben müssen, müssen Sie sie entweder als separate Parameter übergeben oder einen Strukturtyp definieren, der die Länge und die Länge enthält lines Zeiger.


1
2017-09-12 03:51



Du gibst es mit deinem Wert weiter. Es gibt keine Möglichkeit, das herauszufinden.


0
2017-09-12 03:51



Sie können die Länge des dynamisch zugewiesenen Speichers abrufen, OB Du benutzt das NICHTPORTIERBAR MSVC / MinGW Erweiterung:

#include <malloc.h>
char *m = malloc(1234);
#ifdef __int64
printf("m size = %lu bytes", _msize(m) );
#endif

0
2017-09-12 09:33