Pagina 1 di 1

[C] Leggere una variabile generica

Inviato: martedì 15 aprile 2014, 15:49
da 0_sharkkk_0
Salve a tutti,

volevo sapere come passare una variabile generica ad una funzione, che potrebbe essere un intero, stringa, struttura.
potrebbe essere un void* variabile?

Se si mi vengono dei dubbi, come puo un puntatore a void contenere l'indirizzo di una variabile se è void?

Re: [C] Leggere una variabile generica

Inviato: martedì 15 aprile 2014, 16:15
da vaeVictis
1) Sì.
2) Perché il dato puntato non può essere direttamente dereferenziato e, all'atto pratico, ogni indirizzo in un puntatore di tipo void necessita di essere trasformato in qualche altro tipo di puntatore che punti ad una tipo di dato concreto prima di essere dereferenziato.
Se ho capito quello che ti "perplime", non è tanto il fatto che il puntatore contenga qualche indirizzo, ma che non sai a priori la quantità di memoria allocata.

p.s.:
Evita di scrivere l'asterisco sul tipo di dato puntato (come fai con void* ) e metti l'asterisco prima del nome della variabile :)

Re: [C] Leggere una variabile generica

Inviato: mercoledì 16 aprile 2014, 10:49
da 0_sharkkk_0
Intanto grazie per la risposta.

Non ho capito bene la seconda parte della risposta; comunque si, il fatto che mi turba è che ipotizzando di voler passare alla funzione una variabile generica, quindi void *, che noi sappiamo essere una struttura grande 100byte, il compilatore o chi di dovere, come fa ad allocare lo spazio nello stack per questa variabile grande 100byte se noi prendiamo come parametro di una funzione un void *?

a questo punto a cosa servirebbe la malloc se con un void * si puo "prendere" tutto?

Re: [C] Leggere una variabile generica

Inviato: venerdì 18 aprile 2014, 19:32
da vbextreme
il fatto che mi turba è che ipotizzando di voler passare alla funzione una variabile generica, quindi void *, che noi sappiamo essere una struttura grande 100byte, il compilatore o chi di dovere, come fa ad allocare lo spazio nello stack per questa variabile grande 100byte se noi prendiamo come parametro di una funzione un void *?
ed è qui che entra in gioco la magia dei puntatori.
tu non passi tutta la struttura o genericamente tutto il dato, ma solo il suo indirizzo.
Prendiamo ad esempio una architettura a 32 bit, tutta la memoria sarà indirizzata da un puntatore a 4 byte e quindi:_
char* = 4 byte
int * = 4 byte
... = 4 byte
per generalizzare lo standard ha introdotto il puntatore void,ovvero la dimensione che serve per puntare all'area di memoria interessata, quindi un void* sarà sempre grande abbastanza per puntare all'area di memoria voluta.
Essendo tutti i puntatori della stessa dimensione,andrebbe bene anche passarlo per doppio casting con char* o int* ma la lettura del codice potrebbe essere compromessa.
Utile riferimento è la chiamata alla "free(void*)",tale funzione è altamente generica accettando un puntatore generico di dimensioni adeguate alla macchina in uso e questo non vuol dire che gli passi tutta la variabile, quindi il parametro della free non sarà tutta l'area della memoria allocata, ma solo il suo indirizzo.
Se tu vai in posta mica gli porti tutta la buchetta dove recapitarti le lettere,gli dai semplicemente l'indirizzo dove si trova. :lol: