Forum: PC-Programmierung C++ Zeiger auf Struktur inkrementieren?


von Werner (Gast)


Lesenswert?

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

von Slippin J. (gustavo_f)


Lesenswert?

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;

: Bearbeitet durch User
von Arc N. (arc)


Lesenswert?

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;

von Mikro 7. (mikro77)


Lesenswert?

Slippin J. schrieb:
> Das folgende Struct belegt 11 Byte:
> typedef struct {
>     uint16_t index;
>     uint8_t data[9];
> } my_struct_t;

...oder 12 Bytes

@TS: Manche "Dateistrukturen" kann man nicht sinnvoll mit C-structs 
nachbilden. Statt dessen führt man eine Deserialisierung durch. D.h. man 
liest die Daten Byte-für-Byte.

von A. S. (Gast)


Lesenswert?

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];

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.