Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C++ (alle ISO-Standards) ::  Geschützter Speicher char pointer     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Nestor81
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.01.2017
Beiträge: 8
Beitrag Nestor81 Mitglied 15:16:06 09.01.2017   Titel:   Geschützter Speicher char pointer            Zitieren

Hallo zusammen,


Sorry falls es das Thema schon mal gab. Habe es so aufgelöst nicht gefunden.

Mir ist klar, dass:

C++:
char * chZeiger = "Hallo";
chZeiger [0] = 'h';

zum Absturz des Programmes führt, da sich ja wenn ich es richtig verstehe die Daten für Hallo im geschützten Speicher befinden.

Auch:

C++:
cout << chZeiger[99];

ist noch nachvollziehbar. Hier wird auf irgendetwas im Speicher gezeigt, was natürlich in diesem Fall keinen Sinn macht.

Was mich irritiert ist, dass:

C++:
chZeiger [99] = 'h';


auch abbricht. Eigentlich benötigt man hier doch nur 5 Zeichen (für Hallo)und ein \n zur Terminierung.

Wie viel Platz wird jetzt für Hallo im geschützten Speicher reserviert?
Ist der geschützte Speicher auf dem Stack, auf dem Heap oder ist dies ein komplett anderes Konzept?

Besten Dank schon mal.

Grüße




daddy_felix
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.01.2012
Beiträge: 1028
Beitrag daddy_felix Mitglied 15:21:40 09.01.2017   Titel:   Re: Geschützter Speicher char pointer            Zitieren

Nestor81 schrieb:
Eigentlich benötigt man hier doch nur 5 Zeichen (für Hallo)und ein \n zur Terminierung.


Genau. Und deswegen ist chZeiger[99] kein erlaubter Zugriff
DirkB
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.01.2016
Beiträge: 827
Beitrag DirkB Mitglied 15:24:01 09.01.2017   Titel:   Re: Geschützter Speicher char pointer            Zitieren

Nestor81 schrieb:
Ist der geschützte Speicher auf dem Stack, auf dem Heap oder ist dies ein komplett anderes Konzept?
Ja.
Der Standard definiert das nicht.

Aber meist Letzteres.
Die Daten liegen meist im Data-Segment. Und das ist komplett für den Schreibzugriff gesperrt.
Furble Wurble
Unregistrierter




Beitrag Furble Wurble Unregistrierter 16:10:49 09.01.2017   Titel:   Re: Geschützter Speicher char pointer            Zitieren

Nestor81 schrieb:
C++:
char * chZeiger = "Hallo";
chZeiger [0] = 'h';

Über Deine Frage hinaus noch folgendes:

Dein Compiler sollte Dich schon warnen, dass Dein Code da ein Problem hat. Aktivier Warnungen in Deinem Compiler.

Mein Compiler meint beispielsweise:
Zitat:
test.cc:2:21: warning: ISO C++11 does not allow conversion from string literal to 'char *'
[-Wwritable-strings]
char * chZeiger = "Hallo";

"Hallo" ist nämlich per definitionem ein ein const char[6], deswegen muss chZeiger auch vom Typ const char* sein ("Zeiger auf const char").

Wenn Du das berücksichtigst, kompiliert aber die Zuweisung in der Folgezeile nicht mehr: et voilá.
Nestor81
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.01.2017
Beiträge: 8
Beitrag Nestor81 Mitglied 18:33:57 09.01.2017   Titel:              Zitieren

DirkB schrieb:
Nestor81 schrieb:
Ist der geschützte Speicher auf dem Stack, auf dem Heap oder ist dies ein komplett anderes Konzept?
Ja.
Der Standard definiert das nicht.

Aber meist Letzteres.
Die Daten liegen meist im Data-Segment. Und das ist komplett für den Schreibzugriff gesperrt.


Wird der geschützte Speicher über den Windowsdienst "ProtectedStorage" verwaltet?
Oder noch allgemeiner ist das Ganze abhängig vom OS?
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 27973
Beitrag SeppJ Global Moderator 18:43:14 09.01.2017   Titel:              Zitieren

Wie das ganze genau implementiert ist, wird vom C++-Standard nicht festgelegt. Er verlangt noch nicht einmal zwingend, dass es nicht funktionieren dürfte. In der Praxis wird es vom Speicher- bzw Executablemodell des jeweiligen Systems abhängen. Wie der momentane Standard bei einem modernen Windows (das wird auch von der OS-Version abhängen!) aussieht, weiß ich nicht aus dem Kopf. Ich bezweifle aber, dass dies über ProtectedStorage läuft; ProtectedStorage ist eher ein high-level Dienst für Anwendungen. Das wird wahrscheinlich eher über low-level Mechanismen des Betriebssystems bezüglich der Speichervirtualisierung laufen.

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.
icarus2
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1794
Beitrag icarus2 Mitglied 19:03:22 09.01.2017   Titel:              Zitieren

Alle bekannten modernen Betriebssysteme (Linux, Windows, OSX etc) verwenden Virtual Memory. Virtuelle Adressen werden ueber Page Tables auf physikalische Adressen abgebildet. Jeder Schreibe/Lesezugriff auf eine virtuelle Speicheradresse im Programm muss ueber diese Page Tables auf eine physikalische Adresse abgebildet werden.

In disen Pagetables gibt es fuer jede Page (unter anderem) zwei Bits R und W, die fuer Read und Write stehen. Bei jedem Schreib- oder Lesezugriff wird ueberprueft, ob die Bits W bzw. R gesetzt sind. Viele Prozessoren bieten Hardware Unterstuetzung an (siehe z.B. MMU bei Intel), damit das ganze effizient ist.

Unter Linux kommen String Literale wie in deinem Code zum Beispiel in die .rodata Section (siehe ELF Format), in der nur lesen erlaubt ist. In Windows ist das aehnlich, siehe PE (Portable Executable) File Format.
Nestor81
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.01.2017
Beiträge: 8
Beitrag Nestor81 Mitglied 19:16:01 09.01.2017   Titel:              Zitieren

In Ordnung hab es soweit verstanden.

Gibt es irgendwo eine Übersicht, durch welche Konzepte (im Code) etwas im geschützen Speicher landet oder ist das der einzige Fall mit dem char pointer?


Zuletzt bearbeitet von Nestor81 am 19:16:43 09.01.2017, insgesamt 1-mal bearbeitet
C++ Forum :: C++ (alle ISO-Standards) ::  Geschützter Speicher char pointer   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.