You are not logged in.

  • Login

1

Monday, November 14th 2011, 1:25pm

malloc, calloc, realloc

Hallo C Programierer,

Ich habe da mal ein paar verständiniss Fragen zu malloc calloc realloc.

Also folgendes:

malloc: gibt einen void Zeiger auf den Anfangsbereich des allozierten Speichers zurück der Speicher wird auf dem Heap alloziert und ist bei allozierung ohne Wert also nicht initaliesiert

calloc: funktioniert wie malloc nur kann man bei calloc angeben wie viel Speicher für wie viel Element freigegeben werden soll außerdem wird jeder Speicherbereich mit 0 initialsiert

realloc: gibt vorher mit malloc oder calloc erstellten speicher wieder frei und erweitert diesen.


ist das soweit richtig ?

Als nächstes bin ich mir nicht sicher ob ich bisher malloc richtig genutzt habe. Also angenommen ich möchte ein Dynamisches Array erstellen so habe ich das immer so getan:

C/C++ Quellcode

1
int* a =(int*)malloc(sizeof(int));

hat bisher auch so funktioniert zumindest hatt mein Programm getan was es sollte und auch der Compiler hatte nichts einzuwenden.
Aber lege ich so nicht nur speicher für einen int Wert an ?
Also müsste man das so machen :

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int size = 5;
int* a= (int*)malloc(size*sizeof(int));
 
while(1)
{
  /* Hier wird irgenwas eingegeben*/
 
if(eingabe >= size)
{                             	/*Hier wird der Speicher erweitert wenn die Eingabe größer wird*/
   size+=size;
 
  a=(int*)realloc(a,size*sizeof(int));
}
}


Was von beiden ist denn nun richtig? Wenn oberes Falsch ist wäre es interessant zu wissen wieso es die ganze Zeit funktioniert hat ??
oder ist es das selbe???

PS: new und delete ist in C++ das selbe wie malloc in c richtig ?

2

Monday, November 14th 2011, 6:36pm

Mit realloc() ist es noch einfacher, z. B. dynamische Arrays zu programmieren. Die Anfangsadresse des dynamischen Arrays ist diejenige, auf die der Zeiger (zgr) zeigt. Der Parameter neuegroesse dient dazu, einen bereits zuvor allozierten Speicherplatz auf neuegroesse Bytes zu vergrößern. Die Funktion realloc() ermöglicht es auch, den Speicherplatz zu verkleinern. Dazu wird einfach der hintere Teil des Speicherblocks freigegeben, während der vordere Teil unverändert bleibt. Bei einer Vergrößerung des Speicherplatzes mit realloc() behält der vordere Teil auf jeden Fall seinen Wert, und der neue Teil wird einfach hinten angehängt. Dieser angehängte Wert ist aber wie bei malloc() undefiniert. Hier sehen Sie ein kleines Beispiel dafür, wie ein Array mit der Funktion realloc() dynamisch erstellt wird: [quelle]

Also ist es wohl besser realloc zu nutzen, beispiel ist unter dem Link auch zu sehen

Similar threads

Social bookmarks