malloc und static vergleichbar?

Yellow

Yellow

Doppel-As
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
 
Hi, ich lerne ja gerade noch C mit dem Buch "C von A - Z" <- SEHR GUTES BUCH!
THX

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
 
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)!?
 
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.
 
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
 
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;
f = 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?
 
Zuletzt bearbeitet:
Ja.

Du warst wohl zu faul dein kleines Beispiel einfach mal durch den Compiler zu jagen, oder was? :D
 
ä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!
 
Du solltest (musst?) den Rueckgabewert von malloc aber auch casten. In dem Fall sollte es
Code:
f = (int*)malloc(10*sizeof(int));
sein.
 
Du solltest (musst?) den Rueckgabewert von malloc aber auch casten. In dem Fall sollte es
Code:
f = (int*)malloc(10*sizeof(int));
sein.

das Casten ist aber nur für reihne C++ Compilier wichtig. Doch der gcc-compiler kann es auch ohne. ;)
 
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.
 
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 ;)
 

Ähnliche Themen

Konstuktoren und Dekonstruktoren?

Open-Xchange auf OpenSuse mit Commu. Installer - Compiler Fehler

Superkaramba @ Debian FEHLER????

Squid nur zum maskieren der eigenen IP, nicht für Webserver auf port 80

Zurück
Oben