Die zweite Anmerkung betrifft ebenfalls das Scoping von Variablen, und zwar eine Eigenschaft, die insbesondere bei Programmieranfängern häufig zu Verwirrung führt. Variablen unterschiedlicher Scopes haben nichts miteinander zu tun, auch wenn sie den gleichen Namen tragen. Ein Beispiel:

#include <cstdio> void f() { int x = 43; } int main() { int x = 42; f(); printf( "%i\n", x ); }

Dieses Programm wird natürlich die Zahl 42 auf dem Bildschirm ausgeben; zwar wird zwischen der Deklaration und Zuweisung von x = 42 und deren Verwendung in printf die Funktion f aufgerufen, in welcher ebenfalls eine Variable x existiert, welcher der Wert 43 zugewiesen wird, aber diese zweite Variable x hat nichts mit der ersten zu tun und bezeichnet einen vollkommen unabhängigen Speicherbereich. Diesen Punkt gilt es unbedingt zu beachten.

Damit wäre die Einführung zu den Variablen abgeschlossen; im nächsten Artikel wollen wir Funktionen und Variablen kombinieren und uns mit den Funktionsparametern beschäftigen. Außerdem sollen dem Stack noch ein paar Worte gewidmet werden.

1 / 2 / 3 / 4

Kommentare (8)

  1. #1 Andreas
    April 16, 2013

    Sehr schön. Als Info-Dozent freue ich mich immer über die Möglichkeit, die eigene “Vermittlung” der Info-Inhalte vergleichen zu können. Deine Reihe hier ist wunderbar leicht zugänglich. Darf man Sie mit Quellenhinweis verlinken oder eventuell auch im Skript einbauen ?

  2. #2 Marcus Frenkel
    April 16, 2013

    @Andreas

    Klar, kein Problem. So lange die Quellen mit angegeben werden, kann das gern genutzt werden. Ich würde mich freuen, wenn mir noch gesagt wird, wo es genutzt wird, einfach damit ich weiß, wer so alles Interesse an den Inhalten hat und wo sie genutzt werden. 🙂

  3. #3 Doomtrain
    April 16, 2013

    Hm, ich glaub ich hab nen Fehler gefunden.
    Weiter oben steht, der Datenspeicher wird in Heap uns Stack unterteilt. Ich persöhnlich habe mal gelernt, dass sich die Daten im Buffer befinden und Heap die Bezeichnung für den Programmspeicher ist (daher auch der Bufferoverflow, Buffer läuft über, die Daten landen im Heap -> Supergau). Zudem würde ich den Stack auch eher dem Programmspeicher zuordnen.

    Ich kann mich natürlich auch irren, bin kein “echter” Informatiker.

  4. #4 Marcus Frenkel
    April 16, 2013

    @Doomtrain
    Heap und Stack sind beides Datenspeicher, da in beiden Speicherbereichen neue Speicherzellen reserviert und wieder freigegeben werden können (wobei sich nur der Mechanismus dafür in beiden unterscheidet). Der Programmspeicher ist (in der Regel) fest und ändert sich nicht während der Programmausführung.
    Mit Buffer ist im Allgemeinen nur ein zusammenhängender, eventuell erweiterbarer Speicherbereich gemeint; in der Regel sind Buffer im Heap reserviert (wenn man von der Datenstruktur des Buffers redet), können aber auch Stack-Bereiche bezeichnen.

  5. #5 Regina
    April 17, 2013

    42=Douglas Adams, die schönste aller Zahlen 😉

  6. #6 Dr. Webbaer
    April 20, 2013

    Kleine Anmerkung noch hierzu:

    Der globale Scope sollte nach Möglichkeit so selten wie möglich genutzt werden; für die meisten Variablen benötigt man ihn nicht und jede globale Variable macht ein Programm schwerer wartbar, da man die Übersicht über sie behalten muss. Ein übliches Problem mit globalen Variablen sind die Namenskonflikte.

    Hat schon mal wer mit aus Quellcode-Sicht großen Programmen gearbeitet, die ausschließlich mit globalen Variablen arbeiten? – Das ist gar nicht so-o schlecht.

    MFG
    Dr. W (der allerdings nicht so weit gehen würde per GoTo adressierte Programmblöcke (die vielleicht noch in sogenannten Copy-Dateien liegen) Funktionen vorzuziehen 😉 )

  7. #7 Stefan W.
    https://demystifikation.wordpress.com
    April 24, 2013

    Ein übliches Problem mit globalen Variablen sind die Namenskonflikte.

    Das ist auch ein Problem, aber das kleinere. Das Problem an globalen Variablen ist, dass man nicht verfolgen kann, wer sie wann zuletzt geändert hat. Bei nebenläufigen Programmen kann jederzeit jemand anderes dazwischengefunkt haben, und der Wert hat sich seit dem letzten Zugriff, den man verfolgen kann, geändert.

    Nebenläufige Programme, bei denen zwei Instanzen von etwas die gleiche Variable manipulieren – der Horror.

    Das ist nicht nur so-o schlecht, das ist noch viel schlechter.

  8. #8 Dr. Webbaer
    April 25, 2013

    Ein übliches Problem mit globalen Variablen sind die Namenskonflikte.

    Das ist auch ein Problem, aber das kleinere. Das Problem an globalen Variablen ist, dass man nicht verfolgen kann, wer sie wann zuletzt geändert hat.

    Ischt eine Frage der Organisation, des Divide et Impera, der Verteilung der Logik. Man kann so oder so versuchen glücklich zu werden.
    Probleme der beschriebenen Art kann es immer geben.

    Ischt ein wenig so wie mit dem Automechaniker, der in einem Raum nur unter ganz bestimmten Bedingungen zwei Motoren gleichzeitig zerlegen würde, der zudem mehrere Taschen für seine Werkzeuge hat.

    HTH
    Dr. W