[C] Variablen ( extern / intern)..

flexx

Lt. Junior Grade
Registriert
Nov. 2004
Beiträge
348
Hallo!
Ich studier zur Zeit und hab dabei auch das Fach Programmieren in C. Da ich morgen Klausur schreib geh ich gerade ne Altklausur durch und versteh gerade die Welt nicht.

Hier der Code / die Aufgabe:
Code:
Welche Aussage erzeugt das Programm:

#include <stdio.h> 

int c = 10; 
int func ( int x) {
  c = c+x; 
  printf ("c=%d\n" ,c );
  return c+x;
} 

main(){

int c = 10; 
printf ("c=%d\n" ,c ); 
if (c>0){
  int c; 
  c = func(c); 
  printf ("c=%d\n" ,c );
} else
  c += 10; 
printf ("c=%d\n" ,c );
c = func(c); 
printf ("c=%d\n" ,c );
}

Erste Ausgabe ist c = 10, das ist klar. So dann gehts aber durch die If zu c = int ( also kein konkreter Wert)... Wenn dann die func(c) mit diesem Wert als Parameter ausgeführt wird: greift das Programm dann auf das externe c zu?

Das Problem ist auch noch, dass wenn ich das ganze durch den Compiler jage folgendes rauskommt:

Code:
c=10
c=1606422620
c=-1082122066
c=10
c=1606422630
c=1606422640

und bei nem Kollegen

Code:
c=10
c=10
c=10
c=10
c=20
c=30
Hoffe mir kann jmd weiterhelfen.. Wär dringend ( Bis morgen 12 Uhr )
 
Warum wird "c" einmal global und dann nochmal Lokal deklariert?


// Okay sorry.. ja okay
 
Relativ einfach, du hast einmal eine undefinierte Variable:
nach dem if(c>0).
Dadurch wird dein globales c demoliert (in func() bei c= c+x; x ist die undefinierte)
Da wo noch einmal die 10 rauskommt ist es die im Primärskope von main().
Sonst wird immer wieder auf die ungültige Variable zugegriffen.

BTW:
externe Variabeln sind Variablen, die beim Linken auch in anderen Modulen verfügbar sind (Name und Signatur muss die gleiche sein (daher die Realisierung durch include-Dateien)).

Was du meinst sind globale und locale Variabeln.
Globale Variablen sollten möglichst vermieden werden, da sie sonst in größeren Projekten Probelme bereiten.
Sonst zur Ermittelung von Variabeln mit gleichen Namen in unterschiedlichen Scopes: Immer die innerste. Wobei die in anderen unsichtbar sind.
 
Zuletzt bearbeitet:
kleiner hinweis zum verständnis: im gegensatz zu java werden lokale variablen in c nicht mit 0/null initialisiert. wenn dein compiler richtig eingestellt ist sollte er dich auch explizit vor solchen fehlern warnen.
 
Alles klar! Habs verstanden.. dann kann das ja gleich gut gehen ;-)
Danke!
 
IceMatrix schrieb:
wenn dein compiler richtig eingestellt ist sollte er dich auch explizit vor solchen fehlern warnen.

Richtig!

Das obige Beispiel ist übrigens ziemlich unsinnig, um den Scope von Variablen in C zu demonstrieren. Hat sich vielleicht ein Prof. einfallen lassen, der nicht einmal standardkonforme C-Programme schreiben kann.

Nicht nur das er main keinen Rückgabewert spendiert, seine Frage aus der Aufgabe lässt sich auch nicht direkt beantworten, weil eben mit

Code:
if (c > 0) {
    int c;

die lokale Variable nicht initialisiert wird und somit der Wert zufällig ist.
 
Zurück
Oben