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

10 réponses

8 9 10 11 12
Avatar
Charlie Gordon
Je ne sais pas comment on dit tétracapillotracteur en éwé ;-)


Tu veux parler de piloquadrisection ou de tetrapecitomie ?

Chqrlie.
parce que je le vaux bien ;-)

Avatar
Charlie Gordon
"Emmanuel Delahaye" wrote in message
news:
Charlie Gordon wrote on 09/11/04 :
Juste un point de style :

void *a = malloc (sizeof *a *taille)


C'est pas particulièrement lisible ;-)


C'est surtout faux.


T'as raison : il manque le ; et taille est ambigu, on devrait mettre nombre.

Chqrlie

PS: Cette file est devenue completement fufienne.



Avatar
Gabriel Dos Reis
"Antoine Leca" writes:

| Je ne sais pas comment on dit tétracapillotracteur en éwé ;-)

Il faudrait que je l'invente :-)

-- Gaby
Avatar
Gabriel Dos Reis
Emmanuel Delahaye writes:

| > sizeof (*S) == sizeof (T*), forall tags S, T.
|
| J'ai rien compris. Pas assez neurones...

La vraie restriction en question est :

All pointers to
structure types shall have the same representation and
alignment requirements as each other. All pointers to union
types shall have the same representation and alignment
requirements as each other. Pointers to other types need
not have the same representation or alignment requirements.

-- Gaby
Avatar
Gabriel Dos Reis
Emmanuel Delahaye writes:

| Gabriel Dos Reis wrote on 09/11/04 :
| > Emmanuel Delahaye writes:
| >
| >> J'arrête le C!
| >
| > C'est peut-être une bonne idée.
| >
| > -- Gaby
|
| ... toujours sympa.

Tu voulais que je dise que tu avais une très stupide idée ? Cela
n'aurait pas été sympa ;-)

|
| (Ton séparateur de .sig est invalide. Oui, je sais, tu t'en fous...)

Mais j'ai pas de séparateur de .sig. Il ne peut donc pas être invalide.

-- Gaby
Avatar
Antoine Leca
En , Emmanuel Delahaye va escriure:
(Ton séparateur de .sig est invalide.


Tu veux dire que RFC 2822 ou je-ne-sais-laquelle interdit de mettre deux
tirets suivis d'un espace en tête de ligne, par exemple pour simuler le
tiret long qui nous est interdit dans cette hiérarchie ?

Antoine

Avatar
drkm
Emmanuel Delahaye writes:

Gabriel Dos Reis wrote on 09/11/04 :

-- Gaby


... toujours sympa.


N'est-ce pas ?

(Ton séparateur de .sig est invalide. Oui, je sais, tu t'en fous...)


Ne doit-on pas utiliser un caractère blanc -- espace ou retour à la
ligne ?

PS: Je connais ma signature.

--drkm


Avatar
Emmanuel Delahaye
Charlie Gordon wrote on 10/11/04 :
void *a = malloc (sizeof *a *taille)


C'est pas particulièrement lisible ;-)


C'est surtout faux.


T'as raison : il manque le ;


Oui

et taille est ambigu, on devrait mettre nombre.


Exact.

Mais le plus grave, c'est que le type de a étant void *, la taille de
*a n'a aucun sens (même si la syntaxe est acceptée par une extension
laxiste de gcc).

--
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
Emmanuel Delahaye
drkm wrote on 10/11/04 :
-- Gaby


... toujours sympa.


N'est-ce pas ?

(Ton séparateur de .sig est invalide. Oui, je sais, tu t'en fous...)


Ne doit-on pas utiliser un caractère blanc -- espace ou retour à la
ligne ?


La RFC dit "-- n"

--
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
Erwann ABALEA
On Wed, 10 Nov 2004, Emmanuel Delahaye wrote:

drkm wrote on 10/11/04 :
-- Gaby


... toujours sympa.


N'est-ce pas ?

(Ton séparateur de .sig est invalide. Oui, je sais, tu t'en fous...)


Ne doit-on pas utiliser un caractère blanc -- espace ou retour à la
ligne ?


La RFC dit "-- n"


Ne dit-elle pas plutôt "n-- n"?
Ou plutôt "rn-- rn", s'agissant de mail?

Et puis quelle RFC d'abord?

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
Je profite de cet AAD pour faire un hors-sujet car je ne sais oû poser
la question. Je cherche un Web qui explique le mode de transcription
qui permet de transcrire la plupart des alphabets en alphabet latin.
-+- PG in <http://neuneu.mine.nu> : transcrire la charte en neuneu -+-




8 9 10 11 12