C Globale und statische Variable, die im Speicher abgelegt wird

8

Nach dem, was ich über globale und statische Variablen gelernt habe, Wenn eine C-Variable außerhalb aller Funktionen in einer Quelldatei wie folgt deklariert ist:

%Vor%

Auf diese Variable kann von anderen Dateien zugegriffen werden, sobald eine externe Deklaration dafür in der Datei vorhanden ist.
Aber wenn dieselbe Variable wie folgt deklariert wird:

%Vor%

dann kann diese Variable nur von der aktuellen Datei verwendet werden, jede andere Datei wird diese Variable nicht sehen können.

  1. Wenn das Programm zur Laufzeit in den Speicher geladen wird, sind sowohl die globale als auch die statische Variable im Datenabschnitt dieses Programms vorhanden.
    Ich möchte verstehen, dass, da beide im selben Speichersegment gespeichert sind, die statische Variable davor geschützt ist, in keinem Befehl außerhalb ihres Geltungsbereichs verwendet zu werden Was ich denke ist, dass der Umfang der Variablen und ihr Zugriff vom Compiler erledigt werden. Bitte kommentieren Sie, wenn ich falsch liege und füge hinzu, wenn mir ein Detail fehlt.

  2. Bezüglich externer Variable. Wenn,

    %Vor%

    ist in der Datei file1.c definiert und in der Datei file2.c als

    deklariert %Vor%

    Beide Dateien gehören zu verschiedenen Prozessen, sei es process1 und process2. Wenn Prozess1 ausgeführt wird und sein Adressraum in den Speicher geladen wird, ist daher seine Datenabschnittsvariable "a" verfügbar.
    Ich habe hier Zweifel, das heißt, wenn Prozess2 läuft, wird diese Variable auch in den Datenbereich von Prozess2 geladen? oder wie es verwaltet wird.

Bitte helfen Sie mir, meine oben genannten Zweifel auszuräumen. Ich habe im Internet gesucht und ein paar Artikel gelesen und muss bestätigen, ob ich das richtig verstanden habe.
Aso, bitte schlagen Sie mir einen guten Artikel oder ein Buch vor, die mir helfen werden, die oben genannten Konzepte klar zu verstehen.

    
user2333014 06.06.2013, 07:30
quelle

5 Antworten

12

Erstens haben verschiedene Prozesse unterschiedliche Adressräume, wie Sie gesagt haben. Also, es sei denn, Sie teilen sie explizit (Shared Memory oder dergleichen) teilen sie keinen Speicher.

Bei den globalen statischen und globalen nicht statischen Variablen wird der Unterschied Verknüpfung genannt: Nicht-statische globale Variablen haben externe Verknüpfungen , was bedeutet, dass sie einen Namen haben für den Linker, und so kann eine Kompilierungseinheit (.c-Datei) auf die in einem anderen definierte Variable zugreifen.

Eine statische globale Variable hat jedoch eine interne Verknüpfung, und obwohl sie sich möglicherweise im selben Speicherblock befindet wie der erstere, hat sie keinen Namen für den Linker und kann daher nicht von einer anderen Kompilierungseinheit als verwendet werden eine eigene.

    
rodrigo 06.06.2013 07:38
quelle
2
  1. Statische Variablen erhalten eine Adresse und eine Größe im Speicher, aber sie werden nicht angekündigt. Also, wenn ich eine static int a; in einer Datei habe und versuche, mit extern int a; von einer anderen Datei darauf zu verweisen, kann das "link end" nicht gefunden werden, also funktioniert es einfach nicht.

    Um extern funktionieren zu lassen, muss es "etwas" geben, das a als verfügbar anzeigt, was static nicht tut.

  2. Nein, sie gehören nicht zu verschiedenen Prozessen. Sie sind zu einer ausführbaren Datei verbunden, die dann ausgeführt wird. Verschiedene Prozesse können normalerweise nicht auf den Speicher des jeweils anderen zugreifen.

glglgl 06.06.2013 07:36
quelle
1

Wenn Sie eine static -Variable im Dateibereich haben, wird sie für den Linker zum Zeitpunkt der Verknüpfung unsichtbar. Der Compiler gibt keine Anweisung aus, dass ein Symbol (entsprechend der Variablen benannt) für den Linker sichtbar sein sollte.

Bezüglich der zweiten Frage ist extern int a nur eine Deklaration. Es reserviert keinen Platz für diese Variable, sondern informiert lediglich den Compiler, dass eine solche Variable irgendwo existiert. Wenn die Einheit später verknüpft wird, wird der Verweis auf diese Variable vom Linker aufgelöst.

    
Blagovest Buyukliev 06.06.2013 07:36
quelle
1
  

1 Was ich denke ist, dass der Umfang der Variablen und ihr Zugriff vom Compiler erledigt werden. Bitte kommentieren Sie, wenn ich falsch liege und füge hinzu, wenn mir ein Detail fehlt.

Das ist richtig. Der C-Compiler macht diese Variable nicht für andere Compilierungseinheiten zugänglich, so dass Sie kein Programm kompilieren können, das direkt auf diese Variable zugreift. C nennt dieses Konzept Verknüpfung .

Sie könnten eine nicht statische Funktion schreiben, die ihre Adresse zurückgibt, um indirekten Zugriff darauf zu erhalten:

%Vor%

Nun könnten andere Kompilierungseinheiten indirekt auf a zugreifen, indem sie get_a()

aufrufen

Ansonsten ist es Sache eines bestimmten Compilers, wie dies zur Laufzeit dargestellt wird. Wenn du irgendwie außerhalb von C den Speicherort von a herausfinden kannst, kannst du damit so viel herumspielen, wie du willst. Es gibt normalerweise keinen besonderen Schutz oder ähnliches.

  

2 In Bezug auf externe Variable. Wenn Prozess2 läuft, wird diese Variable auch in den Datenbereich von Prozess2 geladen? oder wie es verwaltet wird.

Normale Desktop / Server-Betriebssysteme bieten jedem Prozess virtuellen Speicher. Speichertechnisch sind diese Prozesse unabhängig voneinander und process2 sieht eine eigene Kopie der a -Variable, die nichts mit der Kopie von a in process1 zu tun hat. Die einzige Gemeinsamkeit ist, dass sie aus der gleichen ausführbaren Datei geladen werden.

    
nos 06.06.2013 13:06
quelle
0

both files belongs to different processes bedeutet, dass der Compiler absolut keine Referenz hat, auf die sich extern int a; bezieht. Es durchsucht nicht jedes Stück Code auf Ihrem Computer und hofft, dass es eine und nur eine int a; -Deklaration findet, und fügt dann eine Reihe von Programmen hinzu, um den Speicher dieses Prozesses zu erkennen und darauf zuzugreifen. Abgesehen davon, dass es sich um ein schreckliches Verhalten handelt, wäre das Ausmaß der Komplexität absurd, ohne dass es tatsächlich funktionieren würde.

    
Matthew Read 10.03.2015 15:24
quelle

Tags und Links