PDA

Visualizza la versione completa : [C] Una domanda su un puntatore a void


Downloader
28-02-2008, 18:17
Ho sempre saputo che quando uso la funzione malloc(n) mi viene restituito un puntatore a void relativo al primo byte della locazione appena riservata.

Ma cosa vuol dire che è un puntatore a void??

Se facessi cosi:


lista /* puntatore ad una struct lista */ l = malloc(sizeof(struct lista));

anzichè cosi:



lista l = (lista) malloc(sizeof(struct lista));


Grazie

MacApp
28-02-2008, 18:39
Originariamente inviato da Downloader
Ho sempre saputo che quando uso la funzione malloc(n) mi viene restituito un puntatore a void relativo al primo byte della locazione appena riservata.

Ma cosa vuol dire che è un puntatore a void??

Se facessi cosi:


lista /* puntatore ad una struct lista */ l = malloc(sizeof(struct lista));

anzichè cosi:



lista l = (lista) malloc(sizeof(struct lista));


Grazie
Il compilatore ti dovrebbe segnalare che stai assegnando un puntatore generico ad un puntatore specifico, salvandoti da possibili errori che per poter essere risolti potrebbero richiedere innumerevoli ore di "debug scientifico"

p.s. definizione di "debug scientifico": quando ti trovi a trascrivere su un foglio il valore numerico dei puntatori.

Downloader
28-02-2008, 18:44
Ma sostanzialmente che differenza c'è tra un puntatore a void e un puntatore a un certo tipo??

In fondo l'indirizzo sempre quello è.

LeleFT
28-02-2008, 18:59
Originariamente inviato da Downloader
Ma sostanzialmente che differenza c'è tra un puntatore a void e un puntatore a un certo tipo??

In fondo l'indirizzo sempre quello è.
Certo... ma forse non conosci l'aritmetica dei puntatori: cosa succede se hai un puntatore a int che punta ad un array di double e cerchi di incrementarlo? Un int occupa 4 byte, mentre un double ne occupa 8... un incremento sul puntatore ti porta a metà del primo double e non sul double successivo.


+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
^
+-- Puntatore ad intero su array di double

Dopo l'incremento di "Puntatore"


+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
^
+-- Puntatore

Un incremento di un puntatore a double (come dovrebbe essere) ti avrebbe portato al secondo byte marcato come "0", mentre ora ti trovi solo a metà del primo double... questo perchè il compilatore sa che "Puntatore" è un puntatore ad intero e non a double, quindi lo porta avanti di soli 4 byte anzichè di 8.

Ora prova a immaginare cosa succede quando al posto di puntatori a semplici tipi primitivi, hai puntatori a strutture complesse...


Ciao. :ciauz:

MacApp
28-02-2008, 19:23
Originariamente inviato da Downloader
Ma sostanzialmente che differenza c'è tra un puntatore a void e un puntatore a un certo tipo??

In fondo l'indirizzo sempre quello è.

prova il seguente:



#include <stdio.h>

int main (){
void * aGenericPtr = 0;
char * aCharPtr = (char *) aGenericPtr;
double * aDoublePtr = (double *) aGenericPtr;

printf ("%p;\n", (void *)(aCharPtr + 1));
printf ("%p;\n", (void *)(aDoublePtr + 1));
return 0;
}

Loading