@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
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
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.
@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
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.
@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
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
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.
Das sollte funktionieren:
1 | char feld; |
2 | unsigned long ptr; |
3 | |
4 | ptr=(unsigned long)&feld; |
5 | |
6 | printf("%p, %x\n", &feld, ptr); |
hallo ich würde dies probieren: int *x; printf("%d",&x); nun wird die adresse von x dezimal ausgegeben. & ist der Adressoperator
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.