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;
} |