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?
[C] Leggere una variabile generica
-
0_sharkkk_0
- Prode Principiante
- Messaggi: 19
- Iscrizione: venerdì 14 febbraio 2014, 14:09
- Desktop: ubuntu-2d
- Distribuzione: Ubuntu 12.04.2 LTS i686
- vaeVictis
- Imperturbabile Insigne

- Messaggi: 4703
- Iscrizione: venerdì 27 luglio 2012, 17:58
- Desktop: Gnome
- Distribuzione: Ubuntu 20.04 64bit
Re: [C] Leggere una variabile generica
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
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
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
-
0_sharkkk_0
- Prode Principiante
- Messaggi: 19
- Iscrizione: venerdì 14 febbraio 2014, 14:09
- Desktop: ubuntu-2d
- Distribuzione: Ubuntu 12.04.2 LTS i686
Re: [C] Leggere una variabile generica
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?
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?
- vbextreme
- Entusiasta Emergente

- Messaggi: 1214
- Iscrizione: domenica 12 gennaio 2014, 14:06
- Desktop: lxde
- Distribuzione: xubuntu 14.10
Re: [C] Leggere una variabile generica
ed è qui che entra in gioco la magia dei puntatori.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 *?
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.
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti