Perché le funzioni di allocazione dinamica della memoria in C restituiscono void *?

3

Considera i prototipi delle funzioni di allocazione dinamica di C

malloc - void* malloc(size_t size);

calloc -  void* calloc(size_t n,size);

realloc - void* realloc(void* ptr,size_t newsize);

Ora una frase come la seguente

int* p=(int*)malloc(sizeof(int));

So che trasmettere in (int *) non è necessario in C poiché un puntatore del vuoto può essere assegnato a una variabile puntatore di qualsiasi tipo di oggetto, ma perché queste funzioni per default non restituiscono un puntatore completamente digitato ?. Non sarebbe bello se restituisse int * invece di puntatore vuoto in questo caso? Qual è la ragione void * è scelto come tipo di ritorno di queste funzioni?

Un'altra domanda: ho letto qui che nei vecchi compilatori C il tipo di puntatore restituito da queste funzioni era char * not void * . È vero?

    
posta Destructor 22.07.2015 - 20:44
fonte

2 risposte

10

Perché non può.

Come restituirebbe un puntatore completamente digitato? C non ha modelli / generici e non consente il sovraccarico delle funzioni; per non parlare dell'overload solo per tipo di ritorno. Quindi non c'è alcun meccanismo per avere un malloc che sapesse che tipo volevi.

I've read here that in older C compilers the type of pointer returned by these functions was char* not void*. Is it true?

In C, non c'è byte . char è garantito come un byte lungo, quindi char* è canonico "un puntatore a un buffer di byte", che è esattamente ciò che le funzioni di allocazione della memoria vogliono restituire.

    
risposta data 22.07.2015 - 20:51
fonte
2

Ovviamente malloc() potrebbe restituire un puntatore completamente digitato. Il problema è, di che tipo? Se restituisse un int* , ti renderebbe felice, ma non mi renderebbe felice, perché preferisco un char* . Chiaramente, non potremmo averlo entrambi a nostro modo. Quindi, void* è una buona base di riferimento che non prende le parti di nessuno.

    
risposta data 22.07.2015 - 22:57
fonte

Leggi altre domande sui tag