[C] Leggere una variabile generica

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
0_sharkkk_0
Prode Principiante
Messaggi: 19
Iscrizione: venerdì 14 febbraio 2014, 14:09
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686

[C] Leggere una variabile generica

Messaggio 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?
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [C] Leggere una variabile generica

Messaggio 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 :)
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.»
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

Messaggio 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?
Avatar utente
vbextreme
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1214
Iscrizione: domenica 12 gennaio 2014, 14:06
Desktop: lxde
Distribuzione: xubuntu 14.10

Re: [C] Leggere una variabile generica

Messaggio 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:
Easy framework per il linguaggio C.
vbextreme hack your life
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti