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

Gast #7123127
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);
Gast #7123137
Geht nicht, es sei denn, die in dem Array gespeicherten Daten lassen 
einen Rückschluss auf ihr Ende zu, wie es bei nullterminierten Strings 
der Fall ist.
#7123140
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
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
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

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.