IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

les pointeurs sur pointeurs ne m'aiment pas :/


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut les pointeurs sur pointeurs ne m'aiment pas :/
    Bonjour,
    après presque 2 heures à esseyer de debugguer mon programme je suis parvenu à isoler mon problème. J'ai écrit un code simple mais je ne comprend pas l erreur renvoyée :s
    Si vous avez un petit moment à me consacrez je vous en serai très reconnaissant
    (je me suis permis de rajouter les numéros des lignes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdlib.h>
    #include <stdio.h>
    int main()
    {
    1       int** ppint=NULL;
    2       ppint=malloc(2*sizeof(int*));
    3       (*ppint)=malloc(sizeof(int));
    4       printf("*ppint = %d \n",*ppint);
    5       ((*ppint)+sizeof(int*))=malloc(sizeof(int));
    6       return(1);	
    }
    et au moment de la compilation à la ligne 5 j'obtiens le message suivant :
    error: invalid lvalue in assignment

    voici un petit dessin pour mieux voir le problème : http://img342.imageshack.us/my.php?i...roblemeeu7.jpg

    j'avoue que je suis un peu perdue moi qui pensait avoir tout bien compris au pointeur.

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par ghostnemo
    Bonjour,
    après presque 2 heures à esseyer de debugguer mon programme je suis parvenu à isoler mon problème. J'ai écrit un code simple mais je ne comprend pas l erreur renvoyée :s
    Si vous avez un petit moment à me consacrez je vous en serai très reconnaissant
    (je me suis permis de rajouter les numéros des lignes)

    #include <stdlib.h>
    #include <stdio.h>
    int main()
    {
    1 int** ppint=NULL;
    2 ppint=malloc(2*sizeof(int*));
    3 (*ppint)=malloc(sizeof(int));
    4 printf("*ppint = %d \n",*ppint);
    5 ((*ppint)+sizeof(int*))=malloc(sizeof(int));
    6 return(1);
    }

    et au moment de la compilation à la ligne 5 j'obtiens le message suivant :
    error: invalid lvalue in assignment

    voici un petit dessin pour mieux voir le problème : http://img342.imageshack.us/my.php?i...roblemeeu7.jpg

    j'avoue que je suis un peu perdue moi qui pensait avoir tout bien compris au pointeur.
    Oh que c'est crado.
    Et ils sont ou les free ?

    Et pourquoi tu n'accedent pas aux différents éléments par la méthode logique à savoir ppint[0] et ppint[1];

    Pis main c'est 0 qu'il retourne quand tout se passe bien hein...

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ghostnemo
    après presque 2 heures à esseyer de debugguer mon programme je suis parvenu à isoler mon problème. J'ai écrit un code simple mais je ne comprend pas l erreur renvoyée :s
    Ce que tu veux faire est assez simple, mais tu le fais d'une manière atrocement compliquée. Utilise la notation tableau, ce sera beaucoup plus clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #include <stdlib.h>
    #include <stdio.h>
    int main (void)
    {
       /* allocation d'un tableau de 2 pointeurs sur int */
       int **ppint = malloc (2 * sizeof *ppint);
       if (ppint != NULL)
       {
          /* allocation de deux int */
          ppint[0] = malloc (sizeof *ppint[0]);
          ppint[1] = malloc (sizeof *ppint[1]);
     
          /* utilisation */
     
          /* liberation */
          free (ppint[0]), ppint[0] = NULL;
          free (ppint[1]), ppint[1] = NULL;
          free (ppint), ppint = NULL;
       }
       return 0;
    }
    http://emmanuel-delahaye.developpez....tes.htm#malloc

    Ensuite, regarde comment mettre des boucles for()...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Sorry pour l'oublie des free Skyrunner et c'est vrai que ma présentation était crado lol. Merci de l'avoir corrigé
    En tout cas merci beaucoup Emmanuel pour ta réponse, ça fonctionne nickel
    Mais comme j'suis têtu j'ai voulu trouvé mon erreur ... et grâce à ton code en comparant les differentes @ et les différentes valeurs j'ai pu la trouver ^^
    Elle était double :
    la ligne 5 passe de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((*ppint)+sizeof(int*))=malloc(sizeof(int));
    à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (*(ppint+1))=malloc(sizeof(int));
    Explications : "ppint+1" il faut mettre +1 et non sizeof(int) car du fait que ppint pointe sur un espace qui doit contenir au minimum 4 octets (c'est la taille d'un int*) et le +1 rajoute deja 4 octets au deplacement du pointeur.
    Et en plus autre erreur , j avais fermé la parenthese trop tôt ;p

    enfin si voulez vous rendre compte par vous-meme voila mon code avec pleins de test.Lancez-le ça m'a bien aidé à comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
    int main()
    {
    	printf("sizeof(int) = %d \n",sizeof(int));
    	printf("sizeof(int*)= %d \n",sizeof(int*));
    	printf("sizeof(int**)= %d \n",sizeof(int**));
     
    	int **ppint=(int**)malloc(2*sizeof(int*));
    	if(ppint!=NULL){
    		printf("*ppint  = %d\n",(*ppint));
    		printf("ppint[0] = %d\n",ppint[0]);
    		printf("	allocation memoire à ppint[0]\n");
    		(*ppint)=(int*)malloc(sizeof(int));
    		printf("ppint  = %d\n",(ppint));
    		printf("ppint(int)  = %d\n",(ppint)+1);
    		printf("*ppint  = %d\n",(*ppint));
    		printf("ppint[0] = %d\n",ppint[0]);
    		printf("	allocation memoire à ppint[1]\n");
    		(*(ppint + 1))=(int*)malloc(sizeof(int));// et non ((*ppint)+sizeof(int*))=malloc(sizeof(int));
    		printf("ppint + 1 = %d\n",(ppint + 1));
    		printf("*ppint + 1 = %d\n",(*ppint + 1));
    		printf("*(ppint + 1) = %d\n",*(ppint + 1));
    		printf("ppint[1] = %d\n",ppint[1]);
    		printf("&ppint[1] = %d\n",&ppint[1]);
     
    		printf("	test de cast\n");
    		unsigned int adr=(int)ppint;//cast du pointeur en entier non signé
    		int** pptmp;
    		printf("(adr + 4) = %d\n",adr + 4);
    		pptmp=(int**)(adr+4);
    		printf("*(pptmp) (pptmp contient la valeur de adr+4 avec un cast)=%d\n",*(pptmp));
     
     
    		free(*ppint);free(*(ppint+1));free(ppint);
    	}
    	return(0);	
    }
    Merci encore à toi Emmanuel pour ton aide ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 10/08/2013, 16h17
  2. allocation et pointeur sur pointeur
    Par noobC dans le forum C
    Réponses: 7
    Dernier message: 13/11/2007, 20h00
  3. pointeur sur pointeur générique
    Par j0o0 dans le forum C
    Réponses: 14
    Dernier message: 10/09/2007, 19h52
  4. Réponses: 6
    Dernier message: 02/11/2006, 17h44
  5. pointeur sur pointeur
    Par gaut dans le forum C
    Réponses: 3
    Dernier message: 01/11/2005, 22h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo