2016-07-24 5 views
5

ich in der Dokumentation von sbrk Systemaufruf gesucht und gefunden this:Bedeutung (void *) -1

Bei Erfolg sbrk() gibt die vorherige Programmunterbrechung. (Wenn die Pause erhöht wurde, ist dieser Wert ein Zeiger auf den Anfang des neu zugewiesenen Speichers). Bei einem Fehler wird (void *) -1 zurückgegeben und errno wird auf ENOMEM festgelegt.

Jetzt

  1. Was ist die Bedeutung von (void *) -1?

  2. Wie lautet die genaue Speicheradresse? (Wenn es überhaupt)

  3. Wie wird sichergestellt, dass (void *) -1 ist keine gültige Adresse , die von sbrk() auf Erfolg zurückgeführt werden kann?

Antwort

5
(void *) -1 == (size_t) -1 

Es ist 0xFFFFFFFF auf 32-Bit-Maschine und 0xFFFFFFFFFFFFFFFF auf 64-Bit-Maschine, eine ungültige Adresse, die als jede andere Adresse größer sein soll.

+0

Es tut mir leid, wenn ich total noob klingen, aber wie ist '(void *) -1' gleich' 0xFFFFFFFF' – tomol

+3

@tomol, lesen Sie auf [2s Komplement] (https: //www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html) – Matt

+3

@tomol, denke in die andere Richtung, wie viel ist '0xFFFFFFFF + 1'? es ist '0'! ... Sobald die Variable aufgrund ihrer Bitsize-Limits überläuft, können interessante Dinge passieren ;-) – Myst

2
  1. Was ist die Bedeutung von (void *) -1?

Es ist einfach ein Sentinel-Wert, sbrk() unfähig wären, in einem erfolgreichen Fall zurückzukehren.

  1. Was ist die genaue Speicheradresse er zeigt? (Wenn es überhaupt tut)

Es ist keine gültige Adresse zu erwarten, und der spezifische Wert ist nicht relevant.

  1. Wie ist sichergestellt, dass (void *) -1 keine gültige Adresse ist, die von sbrk() auf Erfolg zurückgeführt werden kann?

Es scheint vielleicht wie Zirkelschluss, aber es ist garantiert, weil sbrk() es im Rahmen seines Vertrages garantiert. (Zum Beispiel könnte sbrk() prüfen, ob es würde diesen Wert zurückgeben, wenn erfolgreich,. Wenn ja, anstatt sie nichts tun konnte, und meldet Fehler)

In der Praxis (void*) -1 auf modernsten Maschinen wird 0xFF...FF werden, die wäre die höchstmögliche Adresse, und das ist einfach etwas, das wahrscheinlich nicht gültig ist.

+1

Auch wenn '0xFF..FF' eine gültige Adresse war, handelt es sich bei Systemen, die den 'sbrk'-Syscall haben, um eine Adresse im Kernel-Space, die im Benutzermodus nicht erreichbar ist. Technisch kann 'sbrk' * irgendeine * Adresse im Kernelraum an den Benutzermoduscode zurückgeben, um einen Fehler anzuzeigen. – datenwolf

Verwandte Themen