Adresse eines Pointers sichern in C

Gast #310126
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
Gast #310128
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
Gast #310129
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.
Gast #310130
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
Gast #879063
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
#879089
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.
#879134
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).

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