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 :

une petite question sur les pointeurs


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Avril 2006
    Messages : 245
    Points : 239
    Points
    239
    Par défaut une petite question sur les pointeurs
    Bon je suis totalement débutant en C, j'arrive au chapitre des pointeurs et malgré mes recherches, je ne comprends pas tout

    Dans tous les exemples que j'ai lus, quand on veut déclarer un pointeur sur un entier (par exemple), on fait :

    et si j'ai bien compris
    var est une adresse
    *var est le contenu à l'adresse var

    C'est ce que me dis tout le monde et tous les bouquins. Pour illustrer cet exemple, je me suis fait un petit prog :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
     
    int main(void) { 
        int* b;
     
        b = 10;
        b++;
     
        printf("Voici les valeurs de a et b : %i", b);
     
        return 0 ;
    }
    Là, je me suis dit que b ne vaudrait pas 11 au final, et j'ai bien eu raison car 14 (en fait 10 + 4 puisqu'on a décalé le pointeur de 4 octets).

    Eh ben, là où je ne comprends pas c'est lorsque je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
     
    int main(void) { 
        int* b;
     
        *b = 10;
     
        printf("Voici les valeurs de a et b : %i", b);
     
        return 0 ;
    }
    Le compilateur ne dis rien et compile normalement, et à l'execution, le prog plante en me mettant le contenu des différents registres du processeur. Pourtant les bouquins disent que *b = 10 fonctionne, et bah moi pas et je pige pas...

    Merci d'avance
    Guy777

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par guy777
    et si j'ai bien compris
    var est une adresse
    *var est le contenu à l'adresse var
    [CODE]
    On va dire que var "contient" une adresse, ni plus ni moins. D'ailleurs, lorsque tu déclares un pointeur, pense à au moins toujours l'initialiser avec NULL comme:

    ...et à l'execution, le prog plante en me mettant le contenu des différents registres du processeur. Pourtant les bouquins disent que *b = 10 fonctionne, et bah moi pas et je pige pas...
    Normal, tu essayes d'affecter une valeur à une zone mémoire non allouée !
    Si tu veux pouvoir lui donner la valeur 10, il faut tout d'abord allouer la zone mémoire, par exemple (pour une seule valeur numérique):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var = malloc (sizeof (*var));
     
    if (var == NULL)
    {
       /* Erreur d'allocation, gerer l'erreur ici */
    }
    Mais attention ... toujours penser à vérer les retour de malloc comme l'exemple ci-dessus ! Aussi, il ne faut jamais oublier de libérer les allocation dynamique avec la fonction free !


    Ton second code corrigé serais:
    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
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        int* b = NULL;
    
        b = malloc (sizeof (*b));
        *b = 10;
    
        printf("Voici les valeurs de a et b : %i", *b);
    
        free (b);
        b = NULL;
    
        return 0 ;
    }
    Attention à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Voici les valeurs de a et b : %i", b);
    c'est pas vrai, ici tu n'affiches pas la valeur de b mais plutôt son adresse, si tel est ce que tu souhaite, tu peux utiliser ce modificateur:
    %p et tu peux faire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Adresse de b : %p", b);
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Avril 2006
    Messages : 245
    Points : 239
    Points
    239
    Par défaut
    Effectivement cela marche beaucoup mieux maintenant

    Merci pour cette réponse rapide
    Guy777

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ce serait bien de vérifier le retour de malloc comme tu le dis et j'ai une préférence pour le free/affectation sur la même ligne...

    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 <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        int* b = NULL;
    
        b = malloc (sizeof (*b));
    
        if (var == NULL)
         {
         /* Erreur d'allocation, gerer l'erreur ici */
         return EXIT_FAILURE;
         }
    
        *b = 10;
    
        printf("Voici les valeurs de a et b : %i", *b);
    
        free (b) , b = NULL;
    
        return EXIT_SUCCESS ;
    }
    Jc

  5. #5
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Foutu copier/coller.....

    Citation Envoyé par fearyourself
    Ce serait bien de vérifier le retour de malloc comme tu le dis et j'ai une préférence pour le free/affectation sur la même ligne...

    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 <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        int* b = NULL;
    
        b = malloc (sizeof (*b));
    
        if (b == NULL)  /* if (var == NULL) */
         {
         /* Erreur d'allocation, gerer l'erreur ici */
         return EXIT_FAILURE;
         }
    
        *b = 10;
    
        printf("Voici les valeurs de a et b : %i", *b);
    
        free (b) , b = NULL;
    
        return EXIT_SUCCESS ;
    }
    Jc
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

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

Discussions similaires

  1. petite question sur les pointeurs
    Par Krisprolls31 dans le forum C
    Réponses: 4
    Dernier message: 20/08/2010, 22h19
  2. [SP-2007] Petite question sur les droits d'une liste de tâche ?
    Par Faro dans le forum SharePoint
    Réponses: 1
    Dernier message: 12/05/2009, 17h58
  3. [JFileChooser] Une petite question sur les chemins par defaut
    Par MDP dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 06/02/2008, 14h49
  4. une petite question sur les combobox
    Par kerkennah dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/01/2007, 05h59
  5. Encore une petite question sur les sockets...
    Par damien99 dans le forum MFC
    Réponses: 4
    Dernier message: 15/02/2006, 14h22

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