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 :

pointeur renvoyant un nombre trop grand


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 251
    Points : 121
    Points
    121
    Par défaut pointeur renvoyant un nombre trop grand
    Bonjour.
    J'ai un soucis avec un bout de code.
    Je définis un pointeur vers une structure s que j'appelle p_s.
    Ensuite je définis 3 opérations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initialiser_p_s qui initialise ma liste d'éléments de type s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ajouter_p_s qui ajoute un élément de type s à la liste p_s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    afficher_p_s qui affiche  les éléments de p_s
    j'utilise les tableaux dynamiques pour stocker ma liste d'éléments de type s.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct s
    {
    int nombre;
    element elt;
    }s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    p_s initialiser_p_s()
    {
    p_s l = (p_s)malloc(sizeof(s));
    if(l!= NULL)
    	{
    		l->nombre = 0;
    		l->elt = NULL;
    	}
    	else
    	{
    		printf("initialisation impossible");
    	}
    	return l;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    p_s ajouter_p_s(p_s l, s e)
    {
    l = (p_s)realloc(l, (l->nombre + 1)*sizeof(s));
    	if(l != NULL)
    	{
    		l[l->nombre] = e;
    		l->nombre++;
    	}
    	else
    	{
    		printf("ajout impossible \n");
    	}
    	return l;
    }
    et enfin
    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
     
    void afficher_p_s(p_s l)
    {
    int i;
    	if(l->nombre == 0)
    	{
    		printf("Vide");
    	}
    	else
    	{
    		for(i=0; i < (l->nombre); i++) 
    		{
    			//affiche_s(l[i]);
    			printf("ceci est une ligne");
    			printf("\n");
    		}
    	}
    }
    Pour tester, je fais juste deux ajouts, et ma fonction
    afficher_p_s
    me renvoie une infinité de
    ceci est une ligne
    .
    J'ai afficher la valeur de
    l->nombre
    , et j'obtiens un chiffre de l'ordre de 19832112.
    Je ne vois vraiment pas où je perd mon pointeur.

    Merci d'avance.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 251
    Points : 121
    Points
    121
    Par défaut
    J'ai fait plusieurs essais, et l->nombre renvoie à tous les coups après deux ajouts exactement 1975037022. Après un ajout 1975037022. Et quand il n y'a aucun ajout 0.

    ????

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 251
    Points : 121
    Points
    121
    Par défaut
    Juste pour ceux que ça peut intéresser, j'avais omis d'initialiser tous les membres de ma structure.

  4. #4
    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
    Chose importante : la manière dont tu utilises realloc est susceptible de générer des fuites de mémoire. En effet, si la fonction échoue, elle ne libère pas le bloc mémoire précédemment alloué. Et comme le pointeur se retrouve écrasé par la valeur NULL, le bloc alloué ne peut donc plus être libéré par la suite, ce qui génère une fuite de mémoire.
    Par conséquent, il faut toujours passer par un autre pointeur (un pointeur temporaire disons) pour l'utilisation de realloc, pour ne pas perdre la valeur du pointeur en cas d'échec. Si la fonction réussit, il suffit alors de copier la valeur du pointeur temporaire vers le pointeur d'origine.

    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
    p_s ajouter_p_s(p_s l, s e)
    {
    p_s ptemprealloc ;
    ptemprealloc = realloc(l, (l->nombre + 1)*sizeof(s));
    	if(ptemprealloc != NULL)
    	{
    		ptemprealloc[ptempreallc->nombre] = e;
    		ptemprealloc->nombre++;
    		l = ptemprealloc ;
    	}
    	else
    	{
    		printf("ajout impossible \n");
    	}
    	return l;
    }
    (je n'ai pas testé le code)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 251
    Points : 121
    Points
    121
    Par défaut
    Message bien reçu Jeroman...

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

Discussions similaires

  1. Enlever le E+12 des nombres trop grands
    Par Marc22 dans le forum Excel
    Réponses: 4
    Dernier message: 18/10/2022, 17h24
  2. Nombre trop grand ?
    Par Guyome41 dans le forum VB.NET
    Réponses: 6
    Dernier message: 23/11/2012, 10h56
  3. Problème avec BigDecimal et nombres trop grands
    Par tomy29 dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 31/12/2009, 17h19
  4. Réponses: 12
    Dernier message: 07/08/2008, 10h06
  5. Stocker un nombre trop grand pour une variable
    Par mouhammed dans le forum C
    Réponses: 2
    Dernier message: 27/12/2007, 11h57

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