Perché malloc e calloc hanno firme diverse?

0

malloc e calloc ha queste firme:

void* malloc( size_t size );
void* calloc( size_t num, size_t size );

Fanno praticamente la stessa cosa. Entrambi assegna un blocco di memoria della dimensione specificata e restituisce un puntatore a quel blocco. La differenza è che calloc inizializza l'intera memoria su zeri. In realtà, calloc potrebbe essere implementato in modo simile a questo:

void* calloc( size_t num, size_t size ) {
    void * ptr = malloc(num*size);
    if(!ptr) return NULL;
    return memset(ptr,0,num*size);
}

(So che ci sono ragioni per non implementarlo in questo modo , ma non è questo l'argomento.)

Dal momento che sono così simili, qual è la ragione delle loro diverse firme? Quando chiami malloc , specifica il numero di byte che desideri e quando chiami calloc specifichi una dimensione di blocco e il numero di blocchi. Non preferisco uno rispetto all'altro, ma mi dà fastidio che siano diversi.

Immagina di aver scritto un pezzo di codice con un po 'di malloc s, e poi ti rendi conto che tutte queste allocazioni devono essere azzerate. Se avessero la stessa firma significherebbe che devi solo cambiare la "m" in una "c".

C'è mai stata una ragione per questa scelta di design, o era solo una coincidenza?

    
posta Broman 22.11.2018 - 18:56
fonte

2 risposte

2

Il C che era standardizzato aveva sperimentato un decennio e mezzo di crescita organica. Non tutto deve avere perfettamente senso. In effetti, molte funzioni standardizzate non hanno molto senso, come la funzione gets() intrinsecamente sicura.

Le allocazioni di calloc(n, sizeof(T)) e malloc(n * sizeof(T)) possono allocare diverse quantità di memoria a seconda delle restrizioni di allineamento del sistema. Questo non è un problema sull'architettura x86, ma potrebbe essere applicato su altre architetture.

    
risposta data 22.11.2018 - 19:17
fonte
1

Se size_t è 32 bit e i puntatori sono 64 ma, non sono affatto equivalenti se size * nitems non si adatta a 32 bit.

    
risposta data 22.11.2018 - 21:06
fonte

Leggi altre domande sui tag