Anzeige:
Ergebnis 1 bis 8 von 8

Thema: [C] Fragen zu static!

  1. #1
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194

    [C] Fragen zu static!

    Hallo Leute!


    Fangen wir mit einem Bsp an:
    Code:
    int * getVar () {
    
    	static int var;
    
    	var = 20;
    
    	return &var;
    
    }
    
    int main () {
    
    	int *i;
    
    	i = getVar();
    
    }
    Wie sicher die meisten von euch wissen, hat 'i' nach getVar() den gleichen Wert wie 'var'! Dazu hätt ich 3 Fragen!
    1) In welchem Speicherbereich wird die Variable 'var' denn erstellt? Ist es der gleiche Speicherbereich wie bei malloc() ?
    2) malloc() braucht immer einen gewissen Aufwand bis der Speicher bereitgestellt wird! Wäre es da nicht schneller wenn man zb anstatt (int*)malloc(sizeof(1000)) einfach static int[1000] schreiben würde?!? Hätte ja den gleichen Effekt...
    3) Was bedeutet static wenn es bei einer Funkton steht... zB static int foo(blabla)?!?


    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  2. #2
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Wie sicher die meisten von euch wissen, hat 'i' nach getVar() den gleichen Wert wie 'var'! Dazu hätt ich 3 Fragen!
    1) In welchem Speicherbereich wird die Variable 'var' denn erstellt? Ist es der gleiche Speicherbereich wie bei malloc() ?
    2) malloc() braucht immer einen gewissen Aufwand bis der Speicher bereitgestellt wird! Wäre es da nicht schneller wenn man zb anstatt (int*)malloc(sizeof(1000)) einfach static int[1000] schreiben würde?!? Hätte ja den gleichen Effekt...
    3) Was bedeutet static wenn es bei einer Funkton steht... zB static int foo(blabla)?!?
    getVar() gibt einen Pointer auf int zurück, also musst du in main() i = *getVar() schreiben, um den Wert von i zu bekommen. Sonst steht in i die Addresse von var.

    Zu den Fragen:
    1) Im globalen, statischen Datenbereich des Programms.
    2) Du meinst sicher (int*)malloc(1000*sizeof(int)): Ist nicht das gleiche, da dieser Speicher nur einmal reserviert werden kann. malloc'ter Speicher wird aber meistens als dynamischer Speicher verwendet, z.B. für Liste etc, da weisst man beim Schreiben des Programm nicht, wieviel Speicher reserviert werden muss. Abgesehen vom logischen Sichtbarkeitsbereich ist es das Gleiche, wie wenn du einen globalen int-Array anlegen würdest.
    3) Statische Funktionen werden in objektorientierten (c++)-Programmen eingesetzt. (Sie arbeiten auf (statischer) Klassenebene und nicht mit Instanzen der Klasse)

    Gruss, Andy

  3. #3
    Registrierter Benutzer
    Registriert seit
    11.03.2004
    Beiträge
    40
    Zu 2)
    Ausserdem ist etwa
    Code:
    int n = 10;
    int foobar[n];
    kein gültiger code,
    Code:
    int n = 10;
    int* foobar = (int*)malloc(n * sizeof(int));
    dagegen schon.
    Zudem ist der Geschwindigkeitsaufwand von malloc zu vernachlässigen, es gibt nur extrem wenige Situationen wo der die Geschwindigkeit deines Programms beeinflusst.

    Zu 3)
    @RapidMax: Also diese Antwort stimmt nicht. Wovon du redest sind statische Methoden (Methoden werden zwar mitunter auch als Funktionen bezeichnet aber in diesem Fall ist die Unterscheidung wichtig), das Schlüsselwort "static" kann aber auch bei ganz normalen Funktionen verwendet werden und hat in C die gleiche Bedeutung (bei Funktionen) wie in C++.

    Eine statische Funktion bedeutet, dass diese Funktion _nur_ in dieser Datei bekannt ist und in keiner anderen. Du kannst nicht aus einer anderen Datei auf sie zugreifen.
    Das heisst insbesondere, dass sie nicht in der Symboltabelle der Objektdatei auftaucht (das ist bei Bibliotheken ggf. nicht unwichtig). Dadurch lassen sich dann Namenskonflikte vermeiden - du kannst den Namen der gleichen Funktion in verschiedenen Dateien verwenden. Ausserdem ist die Zeit die zum linken benötigt wird geringer (wenn du dich je über die langen Start-Zeiten von KDE Programmen aufgeregt hast, weisst du warum das wichtig sein kann).

    CU
    Andi

  4. #4
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    @bmann: Danke für die Korrektur.

    Gruss, Andy

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    Original geschrieben von RapidMax
    getVar() gibt einen Pointer auf int zurück, also musst du in main() i = *getVar() schreiben, um den Wert von i zu bekommen. Sonst steht in i die Addresse von var.
    Ja und wo is da das Problem? In dem Bsp ist i ein Pointer auf int, daher möchte ich auch die Adresse von var bekommen, und ich dann mittel *i den Wert ausgeben kann!

    Ansonsten danke für die Antworten! Bin nun informed !!!

    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  6. #6
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    int n = 10;
    int foobar[n];

    AFAIK ist das nach C99 gültig.

  7. #7
    Registrierter Benutzer
    Registriert seit
    11.03.2004
    Beiträge
    40
    Also ich hab zwar keine Ahnung davon was in C99 steht und wo der Unterschied zwischen all den C/C++ Standards gibt, aber ich weiss dass g++ -pedantic main.cpp das gibt:

    main.cpp: In function `int main()':
    main.cpp:7: error: ISO C++ forbids variable-size array `foo'

    gcc -pedantic main.c dagegen das:
    main.c: In function `main':
    main.c:7: warning: ISO C90 forbids variable-size array `foo'

    Das ist für mich eigentlich Argument genug :-)

    CU
    Andi

  8. #8
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von bmann

    Das ist für mich eigentlich Argument genug :-)
    gcc -W -Wall -pedantic -std=c99 main.c
    Das C99 Argument

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •