Kann die Adresse von Zeigern in zwei Programmen gleich sein? [closed]

Lesezeit: 4 Minuten

Benutzer-Avatar
Saurab Rana

Wenn zwei Programme gleichzeitig laufen und Sie die Adresse ausgeben, auf die der Zeiger zeigt, kann es dann passieren, dass beide Programme denselben Wert ausgeben?

  • “gleichzeitig laufen” geht viel tiefer als es klingt.

    – Yaseen

    21. Dezember 2013 um 7:14 Uhr

  • Zeiger in verschiedenen laufenden Programmen können nicht sein gleichweil es keine Möglichkeit gibt, die anzuwenden == Gleichheitsoperator zu ihnen.

    – Keith Thompson

    21. Dezember 2013 um 7:59 Uhr

  • @KeithThompson: man könnte sich einen Prozessdruck vorstellen %p ein Zeiger und ein anderer, der ihn liest … Sie können sich also eine erfundene Art vorstellen, sie zu vergleichen (auch wenn es unsinnig ist).

    – Basile Starynkevitch

    21. Dezember 2013 um 8:18 Uhr

  • Ich bin etwas überrascht von der hohen Punktzahl, die dieser Frage gegeben wurde. Ich habe nicht das Gefühl, dass “diese Frage viel Forschungsaufwand zeigt und nützlich und klar ist” …

    – Basile Starynkevitch

    21. Dezember 2013 um 12:07 Uhr

  • Ja, durchaus üblich, insbesondere wenn beide Zeiger stehen NULL.

    – MSalter

    21. Dezember 2013 um 12:48 Uhr

Benutzer-Avatar
rjv

Ja. Das Programm läuft in einem vom Betriebssystem zugewiesenen virtuellen Speicher. Die Größe des virtuellen Speichers wird durch die Prozessorarchitektur bestimmt.

Die angezeigte Adresse bezieht sich auf die virtuelle Speicheradresse und nicht auf die physische RAM-Adresse.

Ich würde das hinzufügen jeden Prozess läuft auf einem System bekommt a riesig Adressraum (2^32 auf einem 32-Bit-Betriebssystem und 2^64 auf einem 64-Bit-Betriebssystem), der ihm zugewiesen ist. Auf diesem virtuellen Adressraum läuft ein Prozess.

Benutzer-Avatar
Basile Starynkevitch

Auf Betriebssystemen wie Linux wird ein laufendes Programm als a bezeichnet Prozess. Jeder Prozess hat seinen eigenen Adressraum und verwendet virtueller Speicher. Also die gleiche Adresse 0x12345 bezieht sich normalerweise auf unterschiedliche Speicherzellen in Prozess A und Prozess B.

Lesen Fortgeschrittene Linux-Programmierung das einige Kapitel enthält, die dies erklären (aus Linux-Perspektive). Siehe auch Fork-Systemaufrufund lese Gabel(2), Karte(2), Exekutive(2) Manpages.

Andere Betriebssysteme (Windows, MacOSX) haben ebenfalls Prozesse, die in ihrem eigenen individuellen Adressraum mit virtuellem Speicher laufen.

Details können ziemlich komplex sein (und tatsächlich etwas RAM könnte zwischen Prozessen geteilt werden….). Lesen über kopieren auf schreiben, geteilte Erinnerung etc…

Lesen Sie auch ein gutes Buch darüber Betriebssystemez.B Tanenbaums Buch, bzw Betriebssysteme: Drei einfache Teile (kostenlos im Internet herunterladbar).

  • +1 für fortgeschrittene Linux-Programmierung.

    – Linuxios

    21. Dezember 2013 um 15:57 Uhr

Der Titel Ihrer Frage stimmt nicht ganz mit dem Körper überein. Der Titel fragt:

Kann die Adresse von Zeigern in zwei Programmen gleich sein?

Ja, das ist möglich, da andere bereits darauf hingewiesen haben, dass es virtuellen Speicher und alle möglichen anderen Tricks gibt.

Auch eine NULL Die Zeigerkonstante ist normalerweise in jeder Instanz eines Programms immer gleich (ehrlich gesagt, ich kenne keine Plattform, auf der sie von Lauf zu Lauf variieren würde). Wenn Sie also in beiden Programmen drucken NULLes wird sogar erwartet, dass die Ergebnisse identisch sein werden.


Jetzt in der Frage, fragen Sie nach Drucken diese Hinweise, was eine ganz andere Sache ist:

Wenn zwei Programme gleichzeitig laufen und Sie die Adresse ausgeben, auf die der Zeiger zeigt, kann es dann passieren, dass beide Programme denselben Wert ausgeben?

Da dies mit getaggt ist cich werde es aus C-Sicht beantworten:

Ja. Vorausgesetzt du meinst printf("%p", (void *)thePointer), es ist durchaus möglich. Das %p Der Konvertierungsspezifizierer formatiert den Zeiger auf eine implementierungsdefinierte Weise. Auch wenn Sie es als Ganzzahl ausgeben, nachdem Sie eine ordnungsgemäße Typkonvertierung durchgeführt haben, ist das Ergebnis der Konvertierung wiederum implementierungsdefiniert. Ihr Programm kann also immer drucken 0xffffffff oder foobar oder why are you even curious of internals like a pointer's value jedes Mal, wenn Sie versuchen, einen Zeiger zu drucken. Also ja, es ist möglich, dass die beiden Programme die gleiche Ausgabe haben.

  • Jetzt möchte ich ein Posix-kompatibles Betriebssystem erstellen, das genau das ausgibt, wenn Sie versuchen, einen Zeiger zu formatieren.

    – Kile Damgaard Asmussen

    21. Dezember 2013 um 13:01 Uhr

  • @KarlDamgaardAsmussen Einverstanden! Das würde mir gefallen! 😀

    Benutzer529758

    21. Dezember 2013 um 13:01 Uhr

Die C-Sprache spezifiziert nicht die Interaktion zwischen zwei unterschiedlichen Prozessen. Es gibt keine Garantie dafür, dass Zeiger in zwei verschiedenen Programmen eine sinnvolle Verbindung zueinander haben.

Wenn Sie das Betriebssystem, den C-Compiler und die Ausführung der Programme angeben, erhalten Sie möglicherweise eine hilfreiche Antwort.

Dies ist jedoch nicht etwas, das die C-Sprache zu kontrollieren versucht, und hängt vollständig vom Betriebssystem und der Hardware ab, auf der die Programme ausgeführt werden.

Ja, es kann passieren. Das Programm läuft auf virtuellem Speicher. Wenn ein Prozess mit der Ausführung beginnt, a process address space wird für jeden Prozess erstellt. Nicht nur 2 Prozesse, mehrere Prozesse können beim Drucken dieselbe Adresse haben.

https://stackoverflow.com/a/18479996/1814023 zeigt Ihnen, wie ein Prozessadressraum aussehen wird … Und jedem Prozess wird eine ähnliche Kopie vom Betriebssystem zugewiesen.

Benutzer-Avatar
Tenos

Wenn Sie dies tun möchten, können Sie verwenden Erinnerung teilen zwischen zwei Prozessen.

1354790cookie-checkKann die Adresse von Zeigern in zwei Programmen gleich sein? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy