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.
'sizeof (Zeiger) == 4' (32bit, du bist eingeschaltet), und' sizeof (char [16]) == 16' ... warum bin ich nicht überrascht? –
"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
Und ** niemals ** wenn 1) es ist nicht notwendig oder 2) du verstehst nicht ** alle ** Implikationen oder 3) akzeptiere sie nicht alle! – Olaf