pointer und struktur problem

Gast #2404072
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
Gast #2404100
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.
Gast #2404120
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???
Gast #2404141
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren