Hallo, ist es möglich, in C Variablen an bestimmten Speicheradressen zu deklarieren? In Pascal geht das mit "at". Gibt es etwas vergleichbares in C? So könnte man z.B. einen Integer test1 deklarieren und einen char test2 an der Adresse von test1 und damit automatisch auf die oberen 8 bit von test1 mit test2 zugreifen. Das Beispiel ist natürlich trivial, aber man kann ja so auch komliziertere Strukturen zusammensetzen. Vielleicht kennt jemand eine C-Alternative zum Pascal "at". Gruß, Peter
Das C-Pendant dazu heißt union, hat allerdings nichts mit deiner Fragestellung zu tun. Ansonsten kann man einen beliebigen Zeiger aus einem Integer erzeugen und über diesen auf ein Stück Speicher zugreifen.
Das geht über unions oder Zeiger auf Strukturen. Bei unions an pack und in jedem Fall an endianess denken.
>hat allerdings nichts mit deiner Fragestellung zu tun
Da hat Jörg nicht recht. Du hast Dir da einen Weg ausgedacht, den man in
C eben mit unions usw. erledigt und nicht über setzen einer festen
Adresse.
Im allgemeinen macht man das nur in bestimmten Fällen wie Memory Mapped
IO und andere exotische Esoteriken.
An sich würde es schon so gehen, wie Du sagst. Das wäre aber nicht
portabel und man müsste wissen ob an der Stelle tatsächlich RAM liegt.
Daher macht man das eher über Zeiger (oder eben unions).
Sch.... Es sollte heissen: "Da hat Jörg nicht unrecht". Also: "Da hat Jörg recht".
Vielen Dank für die Antworten, das habe ich gesucht. Wenn ich also einen integerwert in zwei char-Werte zerlegen will, definiere ich das etwa so:
1 | union beide |
2 | {
|
3 | unsigned int i_zahl; |
4 | struct {unsigned char a, b}c_zahl; |
5 | }etwas; |
6 | |
7 | // Zugriff auf den integer:
|
8 | |
9 | etwas.i_zahl = 0xFFAA; |
10 | |
11 | // Zugriff auf die untere char Variable
|
12 | |
13 | if (etwas.c_zahl.a == 0xFF) //sollte true sein!? |
14 | |
15 | // Zugriff auf die obere char Variable
|
16 | |
17 | if (etwas.c_zahl.b == 0xAA) //sollte auch true sein |
Es hängt wohl jetzt vom endianess ab, ob a und b vertauscht auf i_zahl gemappt werden, oder? Ist das soweit richtig? Viele Grüße, Peter
Ja, stimmt. Es die Zeigervariante geht so:
1 | Struct a {int i_a;}; |
2 | Struct b (char c_b1, c_b2}; |
3 | |
4 | char * Buffer; |
5 | Buffer = malloc (.... // oder sowas |
6 | |
7 | i_temp = ((strucht a * ) Buffer)->i_a; |
8 | c_temp = ((struct b *) Buffer)->c_b1; |
Das kommt Deinem ursprünglichen Ansatz schon recht nahe, aber ohne den Nachteil, das die Adresse vor der Laufzeit bekannt sein muss. Ausserdem geht das in der Regel auch auf Compilern ohne pragma pack (wie sie anno dunnemals) üblich waren.
AUch ein interessanter Ansatz, mit verschiedenen Datentypen auf einen vorher reservierten Adressbereich zuzugreifen. Wieder was gelernt. Danke! Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.