Variablen an bestimmten Adressen deklarieren

Gast #1029147
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
Gast #1029164
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).
Gast #1029245
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
Gast #1029270
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.

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