2016-08-12 1 views
0

Ich habe diese Struktur:Cast void * auf struct *

typedef struct 
{ 
    UINT8 a; 
    UINT8 len; 
    BYTE *data; 
} MyStruct; 

und dieses binäre array [0x00, 0x03, 0x08, 0x09, 0x0A], die zu einem void * Variable "BinData" zugeordnet ist.

Wie kann ich BINDATA zu MyStruct umwandeln und auf sein "Daten" -Feld zugreifen können?

Ich habe versucht:

MyStruct *myStruct = (MyStruct*) BINDATA; 

Danach habe ich den Zugriff konnte:

myStruct->a; //gave me 0x00 
myStruct->len; //gave me 0x03 

Aber ich konnte nicht zugreifen

myStruct->data; 

ohne Speicherzugriffsverletzung. Ich denke, das liegt daran, dass der Adresszeiger "Daten" auf 0x08 und nicht auf seinen Wert gesetzt wird.

+1

Was ist '' 'myStruct-> b'''? in Ihrer Struktur kann ich b Mitglied nicht sehen. –

+4

Ist das C oder C++? – TartanLlama

+5

Nicht definiertes Verhalten für den Zugriff auf ein Objekt über einen Lvalue, der nicht dem effektiven Typ des Objekts entspricht. – EOF

Antwort

4

Anstelle von BYTE *data sollten Sie BYTE data[0] verwenden oder (wenn Ihr Compiler das nicht mag) BYTE data[1]. Der Unterschied zwischen Zeiger und Array ist hier entscheidend - Array ist "Daten, die hier sind", während Zeiger "Daten woanders" sind, was nicht Ihr Fall ist.

+0

Wow das funktioniert tatsächlich. Aber ist das nicht ein bisschen hacky? Es sieht im Code seltsam aus, Daten zu definieren [1]; – arminb

+1

@arminb, überhaupt nicht. Sie setzen nur Daten in ein Array, was in Ordnung ist. – ForceBru

+2

@arminb Es wird ein "flexibles Array-Mitglied" genannt. Es ist in C erlaubt, aber nicht in C++. – Barmar

-1

So etwas kann in C++ arbeiten:

UINT* a1 = &myStruct->len; 
UINT* a2 = ++a1; 

Dann werfen a2, was auch immer Sie wollen. Achten Sie auf die Größe und den Typ Ihrer Daten.