malloc und static vergleichbar?

Dieses Thema im Forum "Programmieren allgemein" wurde erstellt von Yellow, 24.07.2007.

  1. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    Hi, ich lerne ja gerade noch C mit dem Buch "C von A - Z" <- SEHR GUTES BUCH!

    Doch ich habe aus diesem Buch immer noch nicht genau verstanden wann ich
    PHP:
    (int *)malloc(sizeof(variable)); // Typencast ist nur bei C++ Compilern notwendig.
    oder static verwenden sollte? Also die Situation in der es eingesetzt werden muß ist mir einfach unklar!

    Vieleicht ist ja einer von euch so nett und kann es mir auf NEWBIE-Sprache erklären ;)

    THX
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 marcellus, 24.07.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    da kann ich nur zustimmen

    der gegensatz zu statischer speicherverwaltung ist der dynamische, der vorteil ist der, dass der speicher wärend der laufzeit allokiert wird und du auch zb in einer schleife beliebig viel speicher allokieren kannst. Das ist vor allem wichtig, wenn du zb einen variabel langen string einlesen willst, du müsstest unendlich viel speicher statisch im voraus belegen, um sicherzugehen, dass du auch wirklich alles hast. So kannst du sogar pro buchstabe etwas dazunehmen, wenns dir spaß macht.

    Aber das steht alles in dem buch, ich habs keine 3 meter weg liegen, wenn dus mir wirklich nicht glaubst kann ich dir die seite raussuchen, aber dafür müsst ich aufstehen:D
     
  4. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    Ich weiß das es im Buch steht. Doch ich verstehe es einfach noch "immer" nicht so genau!

    Also irgendwie habe ich bei der Funktion "malloc" einfach einen Gehirn hänger^^.

    Also das Thema Speicherverwaltung ist aber auch ein sehr Umfangreiches und Kompliziertes Thema. Sry aber dein Beispiel ist für mich irgendwie immer noch ganz unverstänlich. (bin eigentlich nicht so begriffsstuzig)!?
     
  5. #4 marcellus, 25.07.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Na schau, nehmen wir an du willst, dass dein user beliebig viele werte eingeben kann, ums ganz einfach zu machen du willst beliebig viele integer werte einlesen und dann wieder ausgeben.

    Mit einer statischen verwaltung geht das nicht, weil du den speicher vorher reservieren musst, also sowas wie.

    Code:
    int werte[MAX];
    
    wobei du den großen Nachteil hast, dass du vorher angeben musst wieviel speicher du haben willst. Sobald du das Programm startest wird gleich mal sizeof(int)*MAX an speicher belegt, nimmst du zu viel hast du speicher verschwendet, hast du zu wenig genommen wird das programm fatal abstürzen.

    Wenn du das ganze mit dynamischer speicherverwaltung angehst schnappst du dir einfach einen pointer.

    Code:
    int *werte;
    
    und schnappst dir einfach mal einen integer wert.

    Code:
    werte=malloc(sizeof(int));
    
    dann hast du ein int, wenn du mehr willst kannst du mit

    Code:
    werte=realloc(werte, sizeof(int)*anzahl);
    
    deinen vorhandenen speicher erweitern.

    Ist vllt so unanschaulich, aber was hältst du davon du willst zahlen einlesen und sie dan rückwerts wieder ausgeben und das beliebig oft. Schau dir mal das an

    Code:
    /*Programm zum beliebig viele werte einlesen und am ende rueckwerts ausgeben*/
    
    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
            int *werte;     /*einen Pointer anlegen*/
            int i=1;
            werte=malloc(sizeof(int));
            while(scanf("%i", (werte+i*sizeof(int))))
            {
                    i++;
                    werte=realloc(werte, i*sizeof(int)); /*erhoeht um den speicher fuer einen integer*/
            }
            while(--i)printf("Wert %i ist :%i\n", i, *(werte+sizeof(int)*i)); /*ausg
    eben der zahlen*/
            free(werte);
            return 0;
    }
    
    Das ist noch recht einfach, probier das mit statischen variablen nachzuprogrammieren.

    Und gewöhn dir deutsche kommentare gar nicht erst an, mach die gleich englisch.
     
  6. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    marcellus: Also erstmal ein Dickes Lob und THX. Hätte nicht gedacht das es so einfach zu beschreiben ist ;) Also ich werde es selber mal so ausprobieren und etwas experimentieren! ;) Danke für die Mühen!

    Yellow
     
  7. #6 Yellow, 27.07.2007
    Zuletzt bearbeitet: 27.07.2007
    Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    So ich habe mir zuhause nochmal das Thema Dynamischer Speicher unter das Bettkissen gelegt und habe nun noch ein Paar Fragen dazu.

    Kann ich den Allozierten Speicher als Array ansprechen? z.B.

    PHP:
    // Deklarieren
    int *f;
    int j,i=0;
    malloc(10*sizeof(int));
     
    // Initialisieren
    f[0] = 1;
    f[1] = ++i;
    f[2] = 3;
    ....
     
    // Ausgabe
    for(j=1;j<10;++j) {
    printf("%i\n",f[j]);
    }
    Geht das?
     
  8. #7 Mµ*e^13.5_?¿, 27.07.2007
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    Ja.

    Du warst wohl zu faul dein kleines Beispiel einfach mal durch den Compiler zu jagen, oder was? :D
     
  9. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    ähm neh...sry. Den Eindruck soll das nicht erwecken. Ich habe es mit einem ähnlichen Beispiel schon versucht. Doch hat der mir in der While Schleife die Initialisierung fehlgeschlagen. Ich hatte 10 int Werte Alloziert und konnte aber nur bis 5 Werte Initialisieren. Danach kamm ein Speicherfehler und Programm abbruch.

    Deswegen frage ich das hier nochmal! ;) Vieleicht ist ja bei mir ein Denkfehler oder so drin!
     
  10. musiKk

    musiKk Dr. Strangelove

    Dabei seit:
    30.07.2006
    Beiträge:
    264
    Zustimmungen:
    0
    Ort:
    Leipzig
    Du solltest (musst?) den Rueckgabewert von malloc aber auch casten. In dem Fall sollte es
    Code:
    f = (int*)malloc(10*sizeof(int));
    sein.
     
  11. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    das Casten ist aber nur für reihne C++ Compilier wichtig. Doch der gcc-compiler kann es auch ohne. ;)
     
  12. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  13. #11 marcellus, 29.07.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Du hast kaum noch reine c compiler, die c++ nicht können. Also so genau kannst du das nicht abgrenzen. Du solltest aber auch schauen, dass dein code möglichst portabel ist. Das bringt dir nur vorteile, wenn du es gewöhnt bist.
     
  14. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    Es stimmt schon. Doch am Anfang habe ich, tue ich es ohne extra casten damit es mich als Anfänger nicht verwirrt. Doch jetzt denke ich das ich es auch benutzten kann ohne das es meinen Interlegt überfordert ;)
     
Thema:

malloc und static vergleichbar?

Die Seite wird geladen...

malloc und static vergleichbar? - Ähnliche Themen

  1. [C] Speicherzugriffsfehler mit malloc

    [C] Speicherzugriffsfehler mit malloc: [Erledigt] [C] Speicherzugriffsfehler mit malloc Bei dem folgendem Script, bekomme ich immer bei der Zahl "33789" einen Speicherzugriffsfehler....
  2. Static Internetadresse Server - aber Netzwerk geht nicht

    Static Internetadresse Server - aber Netzwerk geht nicht: Hallo Leute, ich habe einen Server billig bekommen und mit CentOS 6.5. Folgendes Problem: Ich bekomme keine Internetverbindung zustande...
  3. Spark IM Stored Static Crypto Key

    Spark IM Stored Static Crypto Key: Spark IM client version 2.6.3 suffers from a cryptography failure where the key for encrypting the passwords is stored statically in...
  4. Static Skype und Ubuntu 9.04 x86_64

    Static Skype und Ubuntu 9.04 x86_64: Hallo, ich habe die statische Version von Skype 2.0.0.72 installiert. Bei der Ausführung kommt allerdings der Fehler: /usr/local/bin/skype: 1:...
  5. Solaris: How to build static iconv

    Solaris: How to build static iconv: Hi zusammen, wie der Name schon sagt versuche ich unter Solaris 7 das tool iconv statisch zu linken. Der Hintergrund. Auf meiner Unixmaschine...