Forum: Mikrocontroller und Digitale Elektronik Adresse eines Pointers sichern in C


von TOM (Gast)


Lesenswert?

@all,

wie ich einen Inhalt einer Speicheradresse auslese ist mir klar aber
kann ich auch die Adresse selbst an der der Pointer steht
auslesen/sichern konnte bis jetzt nichts finden alles beschreibt nur
das  Auslesen des Inhaltes einer Adresse.

TOM

von Ralf (Gast)


Lesenswert?

Gegenfrage: Warum willst du die Adresse sichern? Du kannst den Pointer
doch jederzeit wieder mit dem & (= Adress-of-Operator) auf eine
Variable zeigen lassen. Die einzige Ausnahme ist meines Wissens, wenn
du mit malloc/calloc arbeitest, dann darfst du die Adresse nicht mehr
ändern, sonst ist der allokierte Speicher futsch...

Ralf

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Vielleicht meint Tom ja sowas:

  char Variable;
  char* Pointer;
  char** PointerPointer;

  Pointer = &Variable;

  PointerPointer = &Pointer;

"PointerPointer" enthält die Adresse, an der die Variable "Pointer"
gespeichert ist, ganz genau so, wie "Pointer" die Adresse enthält, an
der die Variable "Variable" gespeichert ist.

von TOM (Gast)


Lesenswert?

@Ralf,

wenn ich eine Variable deklariere wir diese irgentwo geschrieben und
ich möchte gerne wissen an welcher Adresse die Variable steht.
Ist im Prinzip nur eine Verständnisfrage bzw. möchte ich nur wissen ob
es überhaupt möglich ist die Adresse der Variablen auszugeben.

TOM

von Hegy (Gast)


Lesenswert?

Ich bin mir sicher, es war der format specifier %p.

Also geht den so:
1
#include <stdio.h>
2
#include <stdlib.h>
3
                   
4
int main(void)     
5
{             
6
  int i, j = 1;
7
  char *str, val[3] = {0};
8
  long double ld[3] = {91382302.293022232};
9
                                           
10
  str = calloc(1, 1);                      
11
                     
12
  printf("Adr. von\n i=%p, \n j=%p, \n str=%p, \n val=%p, \n
13
ld[0]=%p, \n ld[2]=%p\n", &i, &j, str, val, &ld[0], &ld[2]);
14
                                                                       
15
                                                 
16
  return 0;                                                            
17
                                                 
18
}
Ergebnis:
Adr. von
 i=0xbffff6d8,
 j=0xbffff6dc,
 str=0x8049780,
 val=0xbffff710,
 ld[0]=0xbffff6e0,
 ld[2]=0xbffff6f8

Bug: Es fehlt ein free(str); im Code.

von peter dannegger (Gast)


Lesenswert?

@TOM

"ich möchte gerne wissen an welcher Adresse die Variable steht."


Warum möchtest Du das erst umständlich zur Laufzeit wissen ?

Guck doch einfach nach dem Linken ins Listfile.


Peter

von Martin (Gast)


Lesenswert?

Hallo Leute!

Ich habe den Beitrag gelesen und das Beschriebene erfolgreich 
ausgetestet.

Ich benötige ebenfalls die Zahl der Adresse eines Feldes, weil ich auf 
eine Funktion zugreife, die diese Adresse als 32-Bit-Integer benötigt 
und
es nicht möglich ist, einfach den Zeiger zu übergeben.

sprintf(feld2,"%p",&feld);

Dies funktionierte recht gut. Nur jetzt müsste ich den String von Feld2 
auf einen 32-Bit-Integer konvertieren.
Da es sich hierbei jedoch um einen Mikrocontroller handelt, finde ich 
diese Vorgangsweise sehr Ressourcen-Raubend.

Gibt es eine andere Möglichkeit?
Ich hätte folgende Zuweisung probiert, leider ohne Erfolg:

unsinged long xx;

xx=&feld;

Danke für eure Antworten.


Tschüss
Martin

von Karl H. (kbuchegg)


Lesenswert?

Martin wrote:

> Ich benötige ebenfalls die Zahl der Adresse eines Feldes, weil ich auf
> eine Funktion zugreife, die diese Adresse als 32-Bit-Integer benötigt
> und
> es nicht möglich ist, einfach den Zeiger zu übergeben.

Na, dann caste deine Adresse doch einfach zurecht.

>
> sprintf(feld2,"%p",&feld);
>
> Dies funktionierte recht gut.

Glaub ich nicht. Das macht was völlig anderes.
Es generiert eine Textrepräsentierung des Zahlenwertes der Adresse
und legt diese Repräsentierung (aka: String) in einem Character
Array ab, dessen Adresse in feld2 steht.

Mit der Umwandlung einer Adresse in einen 32-Bit Integer hat das
nichts zu tun.

> Ich hätte folgende Zuweisung probiert, leider ohne Erfolg:
>
> unsinged long xx;
>
> xx=&feld;

So ohne weiteres geht das nicht, weil ja eine Adresse erst mal
kein unsigned long ist.
Da du aber weißt, dass du genau das möchtest: Den Zahlenwert
der Adresse als unsigned long auffassen, kannst du dem Compiler
mitteilen, er soll man sein Typsystem vergessen und die Zuweisung
einfach machen:

  xx = (unsigned long)&feld;


PS: Du brauchst Literatur. Eine Sprache wie C kann man nur bis zu
einem gewissen Grad (der schnell erreicht ist) durch Versuch und
Irrtum erlernen.

von Robert W. (rweber)


Lesenswert?

Das sollte funktionieren:
1
  char feld;
2
  unsigned long ptr;
3
4
  ptr=(unsigned long)&feld;
5
6
  printf("%p, %x\n", &feld, ptr);

von Robert W. (rweber)


Lesenswert?

ups, zu langsam.

von marcel (Gast)


Lesenswert?

hallo

ich würde dies probieren:

int *x;
printf("%d",&x);

nun wird die adresse von x dezimal ausgegeben.

& ist der Adressoperator

von Karl H. (kbuchegg)


Lesenswert?

marcel wrote:
> hallo
>
> ich würde dies probieren:
>
> int *x;
> printf("%d",&x);
>
> nun wird die adresse von x dezimal ausgegeben.

Aber nur dann, wenn sizeof(int) == sizeof(int*)
Was zwar auf einem 16-Bit System sehr oft der Fall ist, du
aber keine Garantie dafür hast.
Bei printf lautet der Formatspezifier für Adressen %p. Den
sollte man dann auch benutzen.

Im Übrigen geht es dem OP aber auch gar nicht um printf, sondern
um die Übergabe einer Adresse an eine Funktion, wobei die Funktion
keinen Pointer erwartet sondern einen unsigned long (warum auch
immer).

von Martin (Gast)


Lesenswert?

Hallo Leute!

Vielen Dank für die Ratschläge und Lösungen.

Danke auch für eure Lösung Karl heinz Buchegger und Robert Weber.
Genau nach der habe ich gesucht.

Tschüss
Martin

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.