calloc wahrscheinlich ist ebenso etwas umgesetzt ähnlich wie:
void * calloc(size_t nmemb, size_t size) {
size_t len = nmemb * size);
void * ptr = malloc(len);
if (ptr) {
return memset(ptr, 0, len);
}
return ptr;
}
So fügt es nur eine mehrfach vor und eine klare nach dem malloc.
malloc könnte (aber wahrscheinlich nicht immer) implementiert, wie:
void * malloc(size_t size) {
return realloc(NULL, size);
}
, da Sie einen NULL-Zeiger wie der vorherige Zeiger passieren realloc, aber malloc ist höchstwahrscheinlich nicht so implementiert, da wäre es Verlangsamen Sie alle mallocs und da Realloc wahrscheinlich malloc verwendet. Die wichtigste Information über Realloc ist, dass es oft in der Lage ist, die tatsächliche Größe des Speicherblocks zu ermitteln, den eine der Heap-Allokationsroutinen zurückgibt, und festzustellen, ob der Block bereits groß genug ist oder in einigen Fällen, wenn er vorhanden ist Am besten versuchen Sie, den Block zu verkleinern oder zu verschieben.
void realloc(void * ptr, size_t size) {
size_t alen = MALLOC_LENGTH_OF(ptr); // this just stands for some method of determining
// the size of the block that was allocated, and could
// be looking it up in a table or looking at a place
// several bytes before the pointer, or some other
// implementation specific thing
if (0 == size) {
free(ptr);
return NULL;
}
if (alen >= size) {
return ptr; // big enough, and not worrying about it being too big
}
void new_ptr = malloc(size); // since I said that malloc most likely isn't
// implemented using realloc using malloc here is ok
if (new_ptr && ptr) {
memcpy(new_ptr, ptr, alen);
}
free(ptr);
return new_ptr;
}
Malloc wird mehr verwendet, weil es am einfachsten ist. Programmierer können ihre Zuweisungen oft groß genug machen, um damit zu beginnen, dass sie sich keine Sorgen machen müssen, dass sie ihre Größe mit Realloc ändern können, und es ist oft nicht nötig, den Speicher zu löschen.
Es gibt verschiedene Verhaltensweisen zwischen verschiedenen Bibliotheken, und Sie können sogar Programme mit anderen Versionen verknüpfen, nur um dieses unterschiedliche Verhalten zu vermeiden (normalerweise ohne den Compiler zu ändern).
Einige malloc-Bibliotheken dienen zum Debuggen und zur Fehlererkennung. Andere bieten möglicherweise eine bessere Leistung.Einige sind dafür optimiert, Speicher für mehrere verschiedene Threads gleichzeitig zuzuweisen, und vermeiden, dass die verschiedenen Threads den gesamten Heap sperren müssen, um eine Zuweisung durchzuführen oder frei.
Alle von ihnen sollten jedoch aus Sicht der Anwendungen die gleiche Semantik bieten.
Vergessen Sie nicht über [variable length arrays] (http://stackoverflow.com/questions/2759294/variable-length-array) :) –