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 :

Pointeurs et adressage aléatoire


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Pointeurs et adressage aléatoire
    Bonjour,

    Comme beaucoup de débutants je bute sur l'assimilation des pointeurs. Afin de mieux comprendre comment ces drôles d'objets fonctionnaient, j'ai voulu tester le transfert de tableaux.

    Pour cela, j'ai créé une fonction generer qui crée un tableau de valeurs à partir de données rentrées par l'utilisateur et l'envoie au main par l'intermédiaire d'un pointeur.

    Le reste de la fonction main consiste à lire le tableau obtenu pour s'assurer qu'il est bien identique au tableau entré plus haut.

    Voilà mon code :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int * generer(int n);
     
    int main()
    {
    int i,n;
    int *T = NULL;
     
    printf("Taille du tableau ? ");
    scanf("%d", &n);
     
    T = generer(n);
     
    for(i=0;i<n;i++)
    	{
    	printf("%d\n",T[i]);
    	}
     
    return 0;
    }
     
    int * generer(int n)
    {
    int i;
    int T[n];
    int *pt = NULL;
     
    for(i=0;i<n;i++)
    	{
    	printf("Element du tableau ? ");
    	scanf("%d", &T[i]);
    	}
     
    pt = &T[0];	
    return pt;
    }
    Mon souci est qu'assez souvent un chiffre diffère entre le tableau de sortie et celui d'entrée ( le 2e ou le dernier élément du tableau sont régulièrement faux tandis que les autres sont exacts )

    J'aimerais savoir d'où peut venir cette irrégularité.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    C'est une erreur classique.
    Ta fonction generer utilise un tableau local, qui est détruit automatiquement à la sortie de la fonction. En fait, le tableau est créé sur la pile d'exécution. Or, lorsque tu sors de la fonction, cet espace peut ensuite être utilisé pour empiler d'autres données. Si tu retourne l'adresse du premier élément de ce tableau à ta fonction appelante, tu auras des valeurs farfelues car ensuite écrasées par le reste du programme.
    Pour résoudre ce problème, ta fonction ne doit utiliser un tableau local, mais elle doit allouer de la mémoire dynamique, grâce à la fonction malloc. L'adresse de ce tableau devra être retourné par la fonction.
    Lorsque tu n'auras plus besoin de ton tableau, il faudra libérer la mémoire allouée, grâce à la fonction free.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Effectivement, maintenant ça marche.

    Pour être sûr de bien comprendre, la fonction malloc réserve une certaine tranche de la mémoire, ce qui empêche le reste du programme de réécrire par dessus tant que je n'ai pas libérée cette partie de la mémoire avec la fonction free ?


    Merci en tout cas

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Pour résumer, il y a plusieurs zones mémoires où peuvent être rangées des données selon la manière dont elles sont créées.

    - La création en allocation statique concerne les variables globales et les variables déclarées static. La variable est créée et initialisée au lancement du programme et détruite en sortie du programme. Sa durée de vie correspond donc à l'exécution du programme.

    - La création en allocation automatique concerne les variables locales à une fonction. La variable est créée (sur la pile) à l'entrée dans la fonction. Elle n'est pas initialisée par défaut, sauf naturellement dans le cas d'une variable déclarée en paramètre de la fonction qui est alors initialisée par l'argument correspondant passé lors de l'appel de la fonction. Elle est détruite automatiquement en sortie de la fonction. Sa durée de vie correspond donc à l'exécution de la fonction.
    C'est pourquoi on ne doit jamais retourner l'adresse d'une variable locale.

    - La création en allocation dynamique. La variable est créée (sur le tas) par les fonctions de la famille malloc() et elle est détruite par la fonction free() donc sur des demandes explicites du programmeur. Le programmeur contrôle donc entièrement sa durée de vie.
    Une telle variable devrait être détruite quand elle ne sert plus (pour que la zone mémoire qu'elle occupe puisse à nouveau être disponible) ou en dernier ressort avant la sortie du programme (bien que les OS modernes récupèrent la mémoire non libérée à la fin du programme)

    - Pour être complet, certaines données peuvent être stockées en mémoire programme (comme les constantes "chaines de caractères"). Dans ce cas ces données sont en lecture seule et il est impérativement interdit d'essayer de les modifier.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/10/2011, 18h44
  2. Réponses: 0
    Dernier message: 25/10/2011, 18h44
  3. adressage de pointeur en C++
    Par JeanNoel53 dans le forum C++
    Réponses: 4
    Dernier message: 29/06/2010, 14h49
  4. adressage d un pointeur
    Par Master55 dans le forum C
    Réponses: 2
    Dernier message: 11/05/2007, 21h41

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