2016-06-08 5 views
-4

Ich brauche nur eine klare Antwort darüber, wenn jemand weiß.
Ich habe bereits überprüft ähnliche Fragen, aber keiner von ihnen klären, was in einem mehrdimensionalen Array passiert. SoGet Länge der 2-D-Array in C

typedef u_char block[16]; 
block *array = (block*) somePointer; 

Ich versuche, einen Strom von Bytes als ein Array von Blöcken zu lesen.
Wieder hat jedes Element die Größe von genau 1 Byte, also versuchen Sie nicht, mich noch mehr zu verwirren, mit Größen und Elementen.
Ich nehme an (hoffe), dass die Variable array ein Array von Blöcken geworden ist.

array[n][16]; 

Wie kann ich den Wert von n bestimmen ?? Ist es endlich?

Einige Tests zeigten, dass:

sizeof(array) == 4;  // n != sizeof (array) 
sizeof(*array) == 16;  // n != sizeof (*array) 
+3

'sizeof (Zeiger) == 4' (32bit, du bist eingeschaltet), und' sizeof (char [16]) == 16' ... warum bin ich nicht überrascht? –

+0

"Ich nehme (hoffe) an, dass das variable Array ein Array von Blöcken geworden ist." - Wenn ein Zeiger ein Array wäre, würde es nicht "Zeiger", sondern "Array" genannt werden! Es zeigt nicht einmal auf ein 2D-Array. Bitte lerne diese Grundlagen. Es gibt genug Fragen darüber, wie man ein 2D-Array deklariert (Anmerkung: es ist ** nicht ** etwas wie "int ** -Array;" - das ist ein weiteres Missverständnis von Anfängern!) – Olaf

+0

Und ** niemals ** wenn 1) es ist nicht notwendig oder 2) du verstehst nicht ** alle ** Implikationen oder 3) akzeptiere sie nicht alle! – Olaf

Antwort

0

, dass die Größe des Zeigers auf die array ist. Es zeigt auf das erste Element des Arrays:

sizeof(array) == 4; 

, dass die Größe des Arrays ist, an dem array Punkte, dh das erste Element (die eine ein Array mit der Länge 16):

sizeof(*array) == 16; 

n muss endlich sein. In C gibt es keine unendlichen Arrays. Der Wert n muss vor der Verwendung definiert werden.

+0

Im Allgemeinen sind Sie richtig, aber ich sehe nicht, wie dies als eine Antwort auf die Frage betrachtet werden kann. :) –

+0

** Wie kann ich den Wert von n ?? Ist es endlich? ** Können Sie die Antworten auf diese Fragen in meiner Antwort finden? – Elyasin

+0

Viel Glück ...... –

1

TL/DR Version

Sie werden nicht in der Lage sein n in einem einzigen Ausdruck zu berechnen, die array Variable. Ein Zeiger auf T zeigt nur auf eine einzelne Instanz von T; Es gibt keine Möglichkeit zu wissen, ob diese Instanz das erste Element eines Arrays von T ist oder nicht.

Long Version

Angesichts der Erklärungen

typedef u_char block[16]; 
block *array = (block*) somePointer; 

Dann wird die folgenden Bedingungen erfüllt sind:

Expression  Type   
    ----------  ----   
     array  block * == u_char (*)[16] // pointer to 16-element array of u_char 
     *array  block == u_char [16]  
sizeof array  size_t == sizeof (block *) == sizeof (u_char (*)[16]) == 4 // on your system     
sizeof *array  size_t == sizeof (block) == sizeof (u_char [16]) == 16 

eine Erklärung wie

block someArray[10]; 
Unter der Annahme,

dann someArray ist ein 10x16 Array von u_char. Sie können die Anzahl der Zeilen in someArray über

sizeof someArray/sizeof *someArray 

bestimmen Dies teilt die Gesamtzahl der Bytes in someArray (160) durch die Anzahl von Bytes in einer einzelnen Reihe von someArray (16), die Anzahl der Zeilen geben (10).

Wenn Sie jedoch

block *array = someArray; 

schreiben dann Sie nicht der Lage sein, die Anzahl der Zeilen in someArray mit der array Variable zu bestimmen. sizeof array gibt die Größe des Zeigers zurück, nicht die Sache, auf die gezeigt wird, und sizeof *array gibt die Größe eines 16-Elemente-Arrays von u_char zurück, nicht die Größe von someArray. So

, wenn Sie schreibt

block *array = (block*) somePointer; // what is the type of somePointer, 
            // and is the cast really necessary? 

Sie array auf eine einzigen Instanz von block zu zeigen. Sie können nicht vom Zeiger selbst bestimmen, wie viele Zeilen von block in somePointer sind.

Sie einen Sentinel-Wert (ähnlich den 0-Terminator in Strings) verwenden könnte irgendwie die letzte Zeile zu markieren (zB wenn alle Elemente dieser Zeile auf 0 gesetzt oder 255 oder ein anderes Muster):

#define TERMINATOR 255 
... 
bool lastRow(block *b) 
{ 
    bool result = true; 
    for (size_t i = 0; i < sizeof *b; i++) 
    result = result && (b[i] == TERMINATOR); 
    return result; 
} 

int main(void) 
{ 
    ... 
    block *array = (block *) somePointer; 
    ... 
    size_t count = 0; 
    while (!lastRow(array++)) 
    count++; 
    ... 
} 

Natürlich funktioniert das nur, wenn eine Zeile aller 255 (oder 0 oder irgendein anderer Wert) nicht anderweitig gültige Daten ist. Andernfalls müssen Sie die Größe von somePointer manuell verfolgen.

+0

Ich schätze Ihre Bemühungen. 'somePointer' ist' u_char * '. Dies zeigt auf einen Strom von ** Bytes ** durch Netzwerkerfassung. Die Länge dieser Daten, die ich bereits verstanden habe, hängt davon ab, was Sie suchen (und natürlich die Länge der Erfassung). – fouss