Pointerproblem
-
Hallo, ich wollte folgendes testen: Ich habe zwei Konsolenanwendungen. Die erste erzeugt einen Pointer auf Integer, die Adresse dieses Pointers wird in einer Datei gepeichert. Die zweite Anwendung liest aus der Datei die hinterlegte Adresse, und legt ebenfalls einen Pointer auf diese Adresse an. Soweit so gut, funktioniert aber nicht. Hier der Code (Nur zu Testzwecken, bitte keine Strukturkritik):
int main(void) { int *a; FILE *fp; a = malloc(sizeof(int)); *a = 1; fp = fopen("C:/multi/pointer.txt", "w"); printf("Adresse von Funktion mit Wert %lu gespeichert\n", (unsigned long)a); fprintf(fp, "%lu", (unsigned long)a); fclose(fp); while(1) { printf("A = [%d], Adresse = %p\n", *a, a); } return EXIT_SUCCESS; }
In der while-Schleife wird die Adresse des Pointers mit angegeben.
Hier die zweite Anwendung:int main(void) { FILE *fp; int *a; unsigned long int Adresse; int b = 1; a = NULL; fp = fopen("C:/multi/pointer.txt", "r"); fscanf(fp, "%lu", &Adresse); fclose(fp); a = (int *)Adresse; while (b) { *a = b; printf("Wert von a = [%d], Adresse = [%p]\n", *a, a); b = 0; printf("Eine Zahl eingeben\n"); scanf("%d", &b); } return 0; }
Hier wird ebenfalls die Adresse des Pointers mit ausgegeben, die sind bei beiden Anwendung gleich, aber bei Wertänderung in der zweiten Anwendung tut sich an der ersten nichts.
Weiss jemand warum??? Vielen Dank.
-
Weil dein Betriebssystem dir das nicht gestattet. Du schreibst auf virtuellen Speicher, gemappt auf den richtigen.
-
leyden schrieb:
Hallo, ich wollte folgendes testen: Ich habe zwei Konsolenanwendungen. Die erste erzeugt einen Pointer auf Integer, die Adresse dieses Pointers wird in einer Datei gepeichert. Die zweite Anwendung liest aus der Datei die hinterlegte Adresse, und legt ebenfalls einen Pointer auf diese Adresse an.
Und wie stellst du sicher, dass der Wert der Adresse unverändert bleibt, nachdem das erste Programm zu Ende ist? Und wie stellst du sicher, dass du nachher auch von dort lesen darfst?
-
Janjan schrieb:
Weil dein Betriebssystem dir das nicht gestattet. Du schreibst auf virtuellen Speicher, gemappt auf den richtigen.
Huh, deine Glaskugel hätte ich gerne. Woher weisst du denn, dass es dort virtuellen Speicher gibt?
-
mngbd schrieb:
Huh, deine Glaskugel hätte ich gerne.
Ist eine Sonderanfertigung, tut mir leid. Unverkäuflich.
-
Das erste Programm läuft ja weiter:
while(1)
somit wird sich die Adresse nicht ändern. Frage mich aber immernoch, warum ich nicht auf die Adresse, die bei beiden Anwenudungen gleich ist zugreifen kann. Wenn ich auf einen virtuellen Speicher schreibe, hab ich dann die Möglichkeit an die tatsächliche Adresse zu kommen ??? (Windows XP)
-
Die beiden Prozesse haben voneinander unabhängige Adressräume; das nennt sich virtuelle Speicherverwaltung.
Es gibt einen Haufen verschiedener Techniken, Daten zwischen zwei Prozessen auszutauschen, für deinen Fall bietet sich shared memory an. Wie das unter Windows geht, kannst du hier nachlesen. Achte aber auf race conditions.
-
mngbd schrieb:
Janjan schrieb:
Weil dein Betriebssystem dir das nicht gestattet. Du schreibst auf virtuellen Speicher, gemappt auf den richtigen.
Huh, deine Glaskugel hätte ich gerne. Woher weisst du denn, dass es dort virtuellen Speicher gibt?
Weil es sonst geklappt hätte.
Außerdem muß jemand, der mit historischer Hardware und/oder embedded Systems arbeitet, das bei der Frage dazuschreiben.
-
leyden schrieb:
Das erste Programm läuft ja weiter:
while(1)
somit wird sich die Adresse nicht ändern.
Hab ich übersehen, sorry.
volkard schrieb:
Außerdem muß jemand, der mit historischer Hardware und/oder embedded Systems arbeitet, das bei der Frage dazuschreiben.
Na wenn du das sagst.