C++ Zeiger auf Struktur inkrementieren?

Gast #4869146
Moin,

ich habe diese Struktur:
1
typedef struct {
2
    uint16_t index;
3
    uint8_t data[];
4
} my_struct_t;

In einem Speicher steht nun ein Array dieser Datenstruktur mit einer 
vorgegebenen Datengröße. Wenn man einen Pointer auf die Struktur setzt 
und einmal inkrementiert, so zeigt dieser richtigerweise 2 Bytes weiter.
1
my_struct_t *p = (my_struct_t *) 0x1000;
2
cout << p << endl;
3
p++;
4
cout << p << endl;

Ausgabe:
0x1000
0x1002

Wie kann ich erreichen dass p z.B. 11 Bytes weiter zeigt, weil etwa in 
einem Datenheader steht dass die Datengröße 9 beträgt und ich so durch 
die Datenblöcke iterieren möchte?

Werner
#4869218
Slippin J. schrieb:
> Das Struct ist 2 Byte groß, da sizeof(uint16_t) = 2 ist. Das char-Array
> dahinter ist ja leer.
>
> Das folgende Struct belegt 11 Byte:
>
>
1
> typedef struct {
2
>     uint16_t index;
3
>     uint8_t data[9];
4
> } my_struct_t;
5
>

Da nach C++ gefragt war, wären da Templates "ein klein wenig" flexibler:
1
template <size_t size> struct my_struct {
2
    uint16_t index;
3
    uint8_t data[size];
4
};
5

6
    auto p = (my_struct<9> *)0x1000;
7
    std::cout << p << std::endl;
8
    p++;
9
    std::cout << p << std::endl;
Gast #4869238
Mit einem Pointer auf eine Struktur iteriert man nicht über ein Feld von 
Bytes.

Mit einem Pointer auf Bytes tut man das.
1
uint_8 *pD=p->data + 9;
2
//oder
3
uint_8 *pD=&p->data[9];
4
//oder
5
uint_8 *pD=&p->data[0];
6
   pD+=9;
7
//oder
8
uint_8 *pD=&p->data[0];
9
   uint_8 Byte0 = pD[9];

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 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.