déréférencement de pointeurs
Bonjour,
je me retrouve confronté à un dilemne : est-ce que le code suivant est correcte ?
Il passe sans soucis à la compilation, avec :
Code:
gcc -ansi -pedantic -Wall -O2 essai.c
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int i;
int j;
char coucou[32];
}toto;
int essai_fun (toto *to1, toto *to2)
{
toto ti1 = *to1;
toto ti2 = *to2;
if ((&ti1 == NULL) || (&ti2 == NULL))
return -1;
else
printf ("ok ");
return 0;
}
int main()
{
int return_code = 0;
int i = 0;
toto to1;
toto to2;
for (i = 0; i < 10000 ; i++)
{
return_code = essai_fun (&to1, &to2);
if (return_code != 0)
{
printf ("ERROR");
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
} |
Je ne parle bien évidemment pas de son intérêt, mais en fait, ce qui me gène, c'est cette ligne là :
Code:
if ((&ti1 == NULL) || (&ti2 == NULL))
J'ai un peu l'impression que c'est un comportement indéfini ou quelque chose dans le style, mais je n'arrive pas à comprendre clairement ce qui se passe, et pourquoi c'est faux.
merci.
Re: déréférencement de pointeurs
:salut:
Citation:
Envoyé par gangsoleil
Je ne parle bien évidemment pas de son intérêt, mais en fait, ce qui me gène, c'est cette ligne là :
Code:
if ((&ti1 == NULL) || (&ti2 == NULL))
J'ai un peu l'impression que c'est un comportement indéfini
Je dirai plutot une ligne inutile puisque ti1 et ti2 sont des variables automatiques donc leurs adresses ne peuvent être NULL.
Code:
1 2
| toto ti1 = *to1;
toto ti2 = *to2; |
Là tu copie les contenus, donc si tu as to1 ou to2 égale à NULL ça risque de mal se passer. Remis dans l'ordre, ça donne plutot ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| int essai_fun (toto *to1, toto *to2)
{
toto ti1;
toto ti2;
if (to1 != NULL && to2 != NULL)
{
ti1 = *to1;
ti2 = *to2;
}
else
{
return -1;
}
return 0;
} |
Re: déréférencement de pointeurs
Citation:
Envoyé par gangsoleil
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
int essai_fun (toto *to1, toto *to2)
{
toto ti1 = *to1;
toto ti2 = *to2;
if ((&ti1 == NULL) || (&ti2 == NULL))
return -1;
else
printf ("ok ");
return 0;
} |
Je ne parle bien évidemment pas de son intérêt, mais en fait, ce qui me gène, c'est cette ligne là :
Code:
if ((&ti1 == NULL) || (&ti2 == NULL))
J'ai un peu l'impression que c'est un comportement indéfini ou quelque chose dans le style, mais je n'arrive pas à comprendre clairement ce qui se passe, et pourquoi c'est faux.
Ce n'est pas faux, c'est plutôt que ça n'a aucun sens de tester si l'adresse d'une variable locale est nulle ou pas. Je pense que tu voulais faire ça:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
int essai_fun (toto *to1, toto *to2)
{
if ((to1 == NULL) || (to2 == NULL))
return -1;
else
{
toto ti1 = *to1;
toto ti2 = *to2;
printf ("ok ");
}
return 0;
} |
ce que personnellement je code comme ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
int essai_fun (toto *to1, toto *to2)
{
int err;
if (to1 != NULL && to2 != NULL)
{
toto ti1 = *to1;
toto ti2 = *to2;
printf ("ok ");
err = 0;
}
else
{
err = -1;
}
return err;
} |