ANSI C: uint8_t* Länge der gespeicherten Daten bestimmen

Gast #7123127
Lesenswert?

Hallo,

bin aktuell dabei die Länge von einem uint8_t Array zu bestimmen.
Dieses Array wird als Pointer einer funktion übergeben. In dieser 
Funktion soll dann die Länge des Arrays ermittelt werden.
1
uint8_t data[50];
2

3
typedef struct
4
  {
5
    uint16_t id;  
6
    uint16_t length;
7
    uint8_t* payload;
8
  }st_Data;
9

10
bool CheckData(st_Data checkData);
11

12
st_Data data1{ 0, 0, data };
13
CheckData(data1);
#7123140
Lesenswert?

Wer so etwas benötigt, der sollte andersrum arbeiten: Nicht erst das 
Array anlegen und dann längen, sondern zusammen mit der Länge als 
Einheit behandeln und dynamisch allozieren (oder statisch per Template, 
wenn C++ eine Option ist).

Man könnte das auch in C direkt und statisch machen, aber das ist dann 
was für Fans von Präprozessor-Orgien.
#7124093
Lesenswert?

Wilhelm M. schrieb:
> Wie sagte schon Bjarne: C-Arrays sind so dumm, sie kennen noch nicht
> einmal ihre Länge.

Naja, ein Array kennt eigentlich schon seine Länge:
1
#include <stdio.h>
2

3
int main()
4
{
5
    char c[500];
6
    printf("%zu\n", sizeof c);
7
    return 0;
8
}

Die Array-Länge ist allerdings nicht Teil des einzelnen Arrays, sondern 
seines Typs. Die Probleme fangen dann bei Zeigern an, weil ein:

toto schrieb:
> uint8_t* payload;

ein Zeiger auf einen uint8_t ist, nicht mehr und nicht weniger. Dieser 
uint8_t kann zwar das erste Element eines Arrays sein und ist es per 
Konvention auch oft, aber dem Zeiger ist das egal. Für den ist das 
Zeigerziel nur ein einzelner uint8_t, daher weiß er auch nichts von 
Array-Größen.
Es gibt auch Zeiger auf Arrays. Die kennen dann die Array-Größe wieder, 
aber auch nur über den Typ.
1
   char (*ptr)[500] = &c;
#7124157
Lesenswert?

Rolf M. schrieb:
> Wilhelm M. schrieb:
>> Wie sagte schon Bjarne: C-Arrays sind so dumm, sie kennen noch nicht
>> einmal ihre Länge.
>
> Naja, ein Array kennt eigentlich schon seine Länge:
>
>
1
> #include <stdio.h>
2
> 
3
> int main()
4
> {
5
>     char c[500];
6
>     printf("%zu\n", sizeof c);
7
>     return 0;
8
> }
9
>
>
> Die Array-Länge ist allerdings nicht Teil des einzelnen Arrays, sondern
> seines Typs.

Natürlich ist das Bestandteil des Typs. Alles andere wäre auch wenig 
sinnvoll, da es sich ja um ein statisch dimensioniertes Array handelt.

Was er (Bjarne) damit ja, dass ein Array-Bezeichner in fast allen 
Anwendungsfällen zu einem Zeiger zerfällt (decay). Damit ist die 
Längeninformation weg. Etwa wenn ein Array-Bezeichner als 
Funktionisargument benutzt wird.

Dies kann man allerdings mit C++-templates wieder elegant vermeiden, 
weil man dann die Länge als NTTP vom Compiler abgeleitet bekommt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren