Domanda

Proveniente da Java sono confuso dall'uso di Void che consente un valore di ritorno nel modo seguente:

void *emalloc(size_t s) {  
    void *result = malloc(s);  
    if (NULL == result) {  
        fprintf(stderr, "MEMORY ALLOCATION FAILURE\n");  
    exit( EXIT_FAILURE );  
    }  
    return result;  
}  

Sta restituendo un puntatore a un mandrino di memoria allocata?

È stato utile?

Soluzione

Sì, lo è. Un puntatore void * è fondamentalmente un puntatore generico a un indirizzo di memoria, che potrebbe quindi essere tipicamente convertito in qualunque tipo fosse effettivamente desiderato.

Altri suggerimenti

La tua domanda indica che stai leggendo male il tipo di ritorno della funzione. C'è una grande differenza tra:

void foo( void ) {}

e

void *bar( void ) {}

foo () non accetta argomenti e non restituisce un valore, mentre bar () non accetta argomenti e restituisce un puntatore generico. In C, la parola chiave void viene utilizzata per indicare un puntatore generico e un oggetto di tipo void * può essere convertito in qualsiasi altro tipo di puntatore oggetto senza perdita di informazioni.

Sì, questa funzione sta restituendo un puntatore alla memoria allocata di una dimensione specificata. È diverso in malloc, nel senso che è garantito per restituire un puntatore. In caso di fallimento uscirà dall'applicazione.

Sì. void * significa puntatore a qualcosa, ma di nessun tipo particolare.

void significa essenzialmente nessun tipo, quindi se abbiamo void * p; p è un puntatore a qualcosa, ma non abbiamo detto cosa.

void senza puntatore non è nulla quindi void foo (void) essendo una funzione che non accetta argomenti e non restituisce nulla.

E sì, malloc restituisce un puntatore a un pezzo di memoria, malloc non sa né si preoccupa del tipo di memoria, quindi il suo tipo restituito è nullo *

In Java non esiste l'aritmetica del puntatore. Pensa che questo sia ciò che stai chiedendo. Ad esempio, immagina che malloc restituisca un puntatore di tipo int

int* malloc(size_t size)
{
    //
}

Probabilmente riceveresti il ??puntatore, che è fondamentalmente un puntatore a un array . Quindi lo indicizzeresti come normali matrici.

int* arr = malloc(10 * sizeof(int)); // 10 contiguous int(s).

Il problema è che C non ha sovraccarico di funzioni. Quindi, dobbiamo trovare un modo per scrivere un malloc generico. Altrimenti, finiresti con un malloc diverso per ogni tipo. La soluzione è inviare il numero richiesto di byte necessari. Quindi, puoi indicizzarlo come preferisci. Ciò offre una maggiore flessibilità e una soluzione per tutti.

int*  i = (int*)malloc(10 * sizeof(int)); // 40 bytes if int = 4 bytes
char* c = (char*)malloc(10 * sizeof(char)); // 10 bytes if char = 1 byte

int  thirdElement = i[3]; // third element. 12 bytes away from (*i)
char secondElement = c[2]; // second element. 2 bytes away from (*c)

Quindi, l'idea generale è che non importa come indicizziamo la memoria che abbiamo ottenuto da malloc . Tutto quello che dobbiamo fare è specificare il tipo di array appena creato per indicizzarlo correttamente. void * significa che si tratta di un puntatore da inserire in memoria che non è stato specificato come indicizzare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top