Forum: PC-Programmierung pointer und struktur problem


von zeus (Gast)


Lesenswert?

Hallo,

kann mir jemand bitte erklären was genau folgende code macht:
1
typedef struct 
2
{   
3
   uint8_t data;
4
   uint8_t *ptr;
5
}frame_t;
6
7
8
uint8_t buffer[5]; 
9
10
int main(void) {
11
      
12
     frame_t *frame_tx_info;
13
     frame_tx_info = (frame_t *)buffer;
14
15
   return EXIT_SUCCESS;
16
}
meine vermutung: pointer frame_tx_info zeigt auf ein frame_t struktur, 
dann wird die adresse, auf die frame_tx_info zeigt gleich das Array 
buffer gesetzt.

meine Fragen:
1) was passiert mit dem gecasteten array buffer, werden mit dem cast 
alle 5 Array inhalte vom typ fram_t sein??

2) worauf zeigt dann der frame_tx_info nach der zeile...
1
     frame_tx_info = (frame_t *)buffer;

vielen Dank voraus

von Krapao (Gast)


Lesenswert?

Die Funktion legt einen lokalen Zeiger auf eine Struktur an. Der Zeiger 
wird auf ein Feld gerichtet. Die Funktion gibt einen Rückgabewert 
zurück.

Die Gefahr besteht, dass dieser Codeabschnitt ausgebaut wird, um auf die 
Elemente der Struktur zuzugreifen. Dabei werden Annahmen gemacht, die 
nicht portabel sind (Größe des buffer == Größe der struct). Vergiss den 
Code; du handelst dir mit dieser Art der Programmierung viel Ärger ein.

Deine Frage 1)
Nein, werden sie nicht. Die Gefahr des Codes liegt in der Annahme, dass 
die frame_t Struktur 5 uint8_t groß ist und dass man einen einfach einen 
5 uint8_t großen Speicherbereich (buffer) bereitstellen kann und daraus 
einen frame_t basteln kann über den man mittels frame_t * Zeiger 
zugreift.

Deine Frage 2)
Progammtechnisch auf buffer. Da frame_tx_info aber lokal ist und die 
Funktion den Wert nie verwendet, kann der C-Compiler die Zeile ersatzlos 
streichen.

von zeus (Gast)


Lesenswert?

Danke für die schnelle antwort,

wenn ich dich richtig verstanden hab, mit folgendem code
1
     frame_t *frame_tx_info;
2
     frame_tx_info = (frame_t *)buffer;
wird durch casten angenommen, dass struktur frame_t aus 5, uint8_t 
elemente (wenn auch nicht hier der fall ist!) besteht,und durch den 
casten und zeiger werden diese 5 elmente in den 5 Array-Bereiche des 
buffers geschrieben, bzw gezeigt!!!

richtig???

von Krapao (Gast)


Lesenswert?

Da wird nix geschrieben. Du hast einen 5 uint8_t großen Speicherbereich 
namens buffer und erzeugst einen Zeiger auf eine Struktur frame_t. Dann 
richtest du den Zeiger auf den Speicherbereich buffer. Ende des 
Codestücks

Wie groß die Struktur frame_t ist, gibt dir der C-Compiler vor. Das 
können je nach System 2, 3, 4, 5 oder mehr uint8_ts sein. Je nachdem wie 
groß der Compiler auf dem System einen uint8_t * Zeiger macht (z.B. 8, 
16 oder 32 Bit) und ob ein Alignment (Ausrichtung Word oder Long 
Grenzen) zwischen dem data und dem ptr gemacht wird.

Der Code nimmt IMHO an: Kein Alignment und 32-Bit Pointer.

von zeus (Gast)


Lesenswert?

ich glaub ich habe es geschnallt, hier spielen also nur die 
Speichergrößen ne rolle, d.h. der pointer frame_tx_info wird als ein 
pointer auf  frame_t intialisiert, dann wird angenommen das auch array 
buffer mit sienen 5 elementen genauso groß ist wie der frame_t 
struktur!!!

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.