Forum: Compiler & IDEs Variablen an bestimmten Adressen deklarieren


von Peter Diener (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Spinne (Gast)


Lesenswert?

Das geht über unions oder Zeiger auf Strukturen.

Bei unions an pack und in jedem Fall an endianess denken.

von Spinne (Gast)


Lesenswert?

>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).

von Spinne (Gast)


Lesenswert?

Sch....
Es sollte heissen: "Da hat Jörg nicht unrecht". Also: "Da hat Jörg 
recht".

von Peter Diener (Gast)


Lesenswert?

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

von Spinne (Gast)


Lesenswert?

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.

von Peter Diener (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.