000
25.05.2005, 17:27 Uhr
Xident
|
Hi!
Da dies mein erster Post/Thread ist und ich noch eher neu auf dieser Site bin, hab ich vorher gründlich die Suchfunktion genutzt um Themen die auf mein Problem zielen herausgesucht und bin leider doch nicht klüger geworden.
Nun, ums kurz zu machen:
Ich verstehe etwas nicht, überhaupt nicht - habe die letzten 2 Tage darüber hin und herüberlegt und versucht es mir irgendwie zu erklären, leider ohne Erfolg. Darum bitte ich euch um hilfe, bzw. um Erklärung (und ja... ich hab circa 4 Bücher gewälzt und es hat auch leider nie dieses Problem angestoßen...)
Es geht um folgendes:
Auf der Speicheradresse (absolut) 0x5a0L ist eine Adresse auf eine Liste gespeichert. Diese wiederum besteht aus zwei Longwerten (ich gehe davon aus das Long hierbei 4 Byte groß ist ... ist halt für ne 32Bit CPU).
Im ganzen sieht der Code (den ich gefunden habe) so aus:
C++: |
#include <stdio.h> #include <string.h>
typedef struct { union { char ascii[4]; long val; } tag; long val; } COOKIE;
int main(void) { COOKIE *c = *((COOKIE **) 0x5a0L); char temp[5]; strncpy(temp,c[0].tag.ascii,4); temp[4]='\0'; printf("%s",temp); return 0; }
|
**** Ist eigentlich eine ganz einfache Sache, wie man sieht. Es geht mir auch nur um diesen einen Ausdruck den ich nicht verstehe:
C++: |
COOKIE *c = *((COOKIE **) 0x5a0L);
|
Ich verstehe nicht warum ich das * vor die in Klammer gesetzte indirektion setzen muß. Für mich bedeutet schon dieses ((COOKIE**) 0x5a0L) das ich zweimal eine indirektion ausführe. Das * (also das vor ((COOKIE **) 0x5a0L) ) bedeute für mich (und deshalb verstehe ich es nicht) das ich den ersten Wert aus der Liste bereits auslese, obwohl ich ja eigentlich COOKIE *c = die adresse dieser mitteilen möchte.
Oder hat das ganze Thema was mit casting zu tun?
Nur um es wirklich noch mal klar zu stellen, wenn ich meine Speicherstellen anschaue:
C++: |
Adresse | Wert $5a0L | $100000 (beispiel ... aber hier steht ja die liste ) .... $100000L | "ABCD" $100004L | 2135442.L
|
Ich möchte also *c auf die adresse von $100000L setzen, diese steht fest in der Adresse $5a0L. Und wie bereits gesagt verstehe ich es nicht warum ich ein -> * <- vor ((COOKIE **) 0x5a0L) setzen muss, da ich der meinung bin, das ich damit bereits schon den Wert "ABCD" auslese und damit dann auch gleich *c initialisiere und nicht $100000L..
Vielen dank schon mal im voraus und bitte helft mir, es ist mir wirklich wichtig!
Bearbeitung von Windalf: |
Bitte Codetags verwenden!!!!
|
Dieser Post wurde am 25.05.2005 um 17:29 Uhr von Windalf editiert. |