OVH Cloud OVH Cloud

cast de pointeur *, ** différence ?

114 réponses
Avatar
Nico
salut,

j'ai un petit code qui m'étonne... soit une fonction prenant un void*
en paramètre, lors de son appel, si je lui passe un double*, mon
compilateur dit rien... ok.
soit une fonction retournant un void *, lorsque j'assigne un double*
avec le retour de cette fonction, mon compilateur ne dit rien...

ici donc, pas besoin de caster ni le paramètre (en (void*)), ni le
retour de fonction (en (double*))...

maintenant, on prend les même et on recommence, à la différence près
que mon argument n'est plus un void* mais un void**, et mon retour
n'est plus un void* mais aussi un void **. là plus rien ne passe...
lors de l'appel de la fonction je suis obligé de caster mon double** en
void**, et lors du retour, je suis obligé de caster en double**,
pourquoi ?

pour un exemple plus parlant, considérez le code suivant :

void *
vect_new(size_t len, size_t size_type)
{
void *v = malloc(len * size_type);
return v;
}


void
vect_free(void *vect)
{
if(vect) free(vect);
}

/*declaration du vecteur...
pas besoin de faire un cast (double*)*/

double *vect = vect_new(3,sizeof(double));

/*appel sans probleme a la compilation :
pas besoin de faire (void*)vect*/
vect_free(vect);


et maintenant avec des void** :

void **
mat_new(unsigned int nrow, unsigned int ncol, size_t size_type)
{
int i,j;
void **m = malloc(nrow * size_type);
if(m)
{
for(i=0; i<nrow; i++)
{
m[i] = malloc(ncol * size_type);
if(!m[i])
{
for(j=0; j<=i; j++)
free(m[i]);
free(m);
m = NULL;
}
}
}
return m;
}

void
mat_free(void **m,unsigned int nrow)
{
int i;
if(m)
{
for(i=0; i<nrow; i++)
if(m[i])
free(m[i]);
free(m);
}
}

/*declaration de la matrice*/
double **matrice = (double**)mat_new(4,3,sizeof(double));

/*appel sans probleme a la compilation : */
mat_free((void**)matrice,4);

là si je cast pas l'un et l'autre... warning... où se situe la
différence avec le 1er exemple ?

merci de m'éclairer à ce propos.

--
Nico,
http://astrosurf.com/nicoastro
http://nicolas.aunai.free.fr

4 réponses

8 9 10 11 12
Avatar
James Kanze
Gabriel Dos Reis writes:

|> James Kanze writes:

|> | Gabriel Dos Reis writes:

|> | |> Emmanuel Delahaye writes:

|> | |> | > Gaby, le saut à la ligne manque.

|> | |> | Oui. Mais même une chose aussi simple et évidente donne lieu
|> | |> | à d'interminables sarcasmes... fatigant...

|> | |> Si tu définis un entier comme une suite de chiffres décimaux,
|> | |> il te faut de la détermination stupide pour dire que « foo9 »
|> | |> est un entier invalide.

|> | Je crois qu'il faisait référence à l'autre côté. Ou non -- d'une
|> | part, je ne vois pas pourquoi tu veux être différent, quand il y a
|> | une norme,

|> Je ne veux pas être différent.

Tout le monde mais un .sig. Toi non. J'appelle ça être différent.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Avatar
drkm
James Kanze writes:

Tout le monde mais un .sig.


Bof.

--drkm

Avatar
Emmanuel Delahaye
James Kanze wrote on 13/11/04 :
Tout le monde mais un .sig.


'met'

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Gabriel Dos Reis
James Kanze writes:

| Gabriel Dos Reis writes:
|
| |> James Kanze writes:
|
| |> | Gabriel Dos Reis writes:
|
| |> | |> Emmanuel Delahaye writes:
|
| |> | |> | > Gaby, le saut à la ligne manque.
|
| |> | |> | Oui. Mais même une chose aussi simple et évidente donne lieu
| |> | |> | à d'interminables sarcasmes... fatigant...
|
| |> | |> Si tu définis un entier comme une suite de chiffres décimaux,
| |> | |> il te faut de la détermination stupide pour dire que « foo9 »
| |> | |> est un entier invalide.
|
| |> | Je crois qu'il faisait référence à l'autre côté. Ou non -- d'une
| |> | part, je ne vois pas pourquoi tu veux être différent, quand il y a
| |> | une norme,
|
| |> Je ne veux pas être différent.
|
| Tout le monde mais un .sig. Toi non.

Non, tout le monde (a l'excusion de ma personne) ne met pas un sig.

-- Gaby
8 9 10 11 12