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 :

Comment initialiser un pointeur ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Par défaut Comment initialiser un pointeur ?
    Salut à tous :-)

    Bon voilà, je veux écrire une fonction en C qui reçoit un pointeur de type int et l’initialise :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int init(int* x) {
        x = (int*) malloc(sizeof (int));
        if (x == NULL) return 0;
        else {
            *x = 90;
            return 1;
        }
    }
     
    int main() {
        int *r;
        init(r);
        if (!init(r)) printf("Memoire insufisante");
        else
            printf("%d", *r);
        return 0;
    }
    Mais le problème c'est que le programme plante lors de l'exécution.
    Où est-il le Bug ?

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Je t'invite à regarder cette discussion où IsraGab a rencontré le même problème. Avec en particulier les messages #5 et #7.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Par défaut
    Merci beaucoup de m'avoir répondu si rapidement.
    En ce qui concerne le lien, je vois que le problème de IsraGab été avec la copie du string au lieu de l'affectation directe et je parle pas de cela :-)

    D'autre part, j'ai remarqué que la fonction marche si on lui passe la référence du pointeur :
    int init(int* &x) {
    ...
    }
    Qu'en vous pensez ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Non tu ne parles pas de string mais de pointeur sur int, mais le principe est exactement le même que celui expliqué dans les messages vers lesquels je t'ai dirigé.
    À savoir que tu manipules au sein de ta fonction init() une copie du pointeur original r. Autrement-dit une assignation du type x = ... n'aura aucune influence sur r contrairement à *x = ... qui modifiera bien le contenu pointé. Il faut ainsi utiliser un pointeur de pointeur pour effectivement répercuter le changement imposé par malloc().

    L'utilisation de la référence est correcte, sauf que (comme aussi indiqué dans la discussion...) c'est du C++ et non du C.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Par défaut
    À savoir que tu manipules au sein de ta fonction init() une copie du pointeur original
    Mais si on passe un pointeur d'une variable, alors les modifications effectués sur la copie seront aussi effectuer sur l'originale, car l'adresse du variable est "unique", n'est-ce pas ?
    Donc pourquoi a-t-on besoin de passer un pointeur de pointeur ?

    L'utilisation de la référence est correcte, sauf que c'est du C++ et non du C.
    Et si je veux écrire un Code C "pure", Que dois-je faire ?

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par khaled_prg Voir le message
    Mais si on passe un pointeur d'une variable, alors les modifications effectués sur la copie seront aussi effectuer sur l'originale, car l'adresse du variable est "unique", n'est-ce pas ?
    Donc pourquoi a-t-on besoin de passer un pointeur de pointeur ?
    Un pointeur est aussi une variable. Si tu souhaites modifier l'objet vers lequel il pointe, il faut modifier sa valeur et donc passer par un pointeur.
    D'où l'utilisation de pointeurs de pointeur.

    Citation Envoyé par khaled_prg Voir le message
    Et si je veux écrire un Code C "pure", Que dois-je faire ?
    En C, on utilise des pointeurs constants à la place de références.

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 19/06/2014, 10h33
  2. Comment initialiser une ChildFrame ???
    Par loupdeau dans le forum MFC
    Réponses: 14
    Dernier message: 22/03/2005, 13h28
  3. Réponses: 4
    Dernier message: 08/02/2005, 20h47
  4. Comment initialiser un vector à sa création ?
    Par Clad3 dans le forum SL & STL
    Réponses: 7
    Dernier message: 10/12/2004, 15h01
  5. Initialisation de pointeurs
    Par Gnux dans le forum C
    Réponses: 5
    Dernier message: 03/10/2003, 17h10

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