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 :

problème avec les pointeurs en c


Sujet :

C

  1. #1
    Membre du Club Avatar de dialloma
    Homme Profil pro
    Java / J2EE, PHP
    Inscrit en
    Août 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Java / J2EE, PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut [Résolu] problème avec les pointeurs en c
    bonjour à tous. Je suis entrain de faire des exercices sur les listes chainées, mais j'avoue qu'il y a quelque chose que je n'ai pas bien compri. J'ai fais un code à mo avis très simple d'insertion d'entiers dans une liste ordonée mais je ne sais pas vraiment à quel niveau se trouve le problème, j'ai une erreur du type "segentation fault", donc un problèmr de pointeurs j'immagine. je vous poste le code et voir si vous pourriez me donner un coup de main. Je suis ouvert à tous les critiques et suggestions,..merci d'avance
    voici mon type Liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct Liste{
     
    	int valeur; //champ données
    	struct Liste *suiv; //pointeur vers l'élément suivant
     
    } Liste;
    puis le 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
    void insererEnOrdre(Liste **tete, int x){
     
    	Liste *p, *pp, *nouvelElement;
     
    	p = *tete;
    	pp = p;
    	//printf("(x, tete.val) = (%d , %d )\n", (*tete)->valeur, x);
    	if(*tete == NULL){
    				printf("1 ");
    		ajouterEnTete(tete, x);
    	}else{
    		while(p!=NULL && x > p->valeur){
    			pp = p;
    			p = p->suiv;
    		}
    		if(p!=NULL && x == p->valeur){
    			//on insert pas x ici, mais on peut bien choisir de l'inserer aussi
    			//dans ce cas on le fais dans le cas précédent
    			printf("%d existe déjà ",x);
    			return;
    		}else{
    			nouvelElement = malloc(sizeof(Liste));
    			nouvelElement->valeur = x;
    			if(p!=NULL && x < p->valeur){
    				//insertion de x avant p et après pp 
    				nouvelElement->suiv = p;
    				pp->suiv = nouvelElement;
    			}else{
    				//insertion en queue
    				//nouvelElement->suiv == NULL;
    				pp->suiv = nouvelElement;
    			}
    		}
    	}
     
    }
    et mon main

    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>
     
     
    #include "ListeChaineeSimple.h"
     
     
    int main(void){
     
    	Liste *maListe = NULL;
     
    	insererEnOrdre(&maListe, 60);
    	insererEnOrdre(&maListe, 20);
    	insererEnOrdre(&maListe, 15);
    	insererEnOrdre(&maListe, 100);
    	insererEnOrdre(&maListe, 15);
    	insererEnOrdre(&maListe, 10);
     
    	afficher(maListe); 
     
    return EXIT_SUCCESS;
    }

  2. #2
    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 : 67
    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 dialloma
    je vous poste le code et voir si vous pourriez me donner un coup de main. Je suis ouvert à tous les critiques et suggestions,..merci d'avance
    Ton code est incomplet. Poste une version compilable qu'on puisse le tester vraiment.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre du Club Avatar de dialloma
    Homme Profil pro
    Java / J2EE, PHP
    Inscrit en
    Août 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Java / J2EE, PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ton code est incomplet. Poste une version compilable qu'on puisse le tester vraiment.
    Voici le code complet.
    1. ListeChainee.h

    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
    #ifndef CGI_PILE_H
    #define CGI_PILE_H
     
    typedef struct Liste{
     
    	int valeur; //champ données
    	struct Liste *suiv; //pointeur vers l'élément suivant
     
    } Liste;
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    //prototype des fonctions
     
    void ajouterEnTete(Liste **, int); //ajouter un element à la tête d'une liste 
    void ajouterEnQueue(Liste **, int); //ajouter x à la fin d'une liste 
     
    void insererEnOrdre(Liste **, int);		//ajouter x à n'importe quelle position d'une liste(qui est ici ordonée)
     
    void afficher(Liste *); //affiche tous les éléments de la liste
     
    #ifdef __cplusplus
    }
    #endif        
     
    #endif
    1. ListeChainee.c

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
     
    #include "ListeChaineeSimple.h"
     
     
    void afficher(Liste *tete){
    	Liste *p;
    	p = tete;
    	printf("Début de l'affichage \n");
    	while(p!=NULL){
    		printf("%d \n",p->valeur);
    		p = p->suiv;
    	}
    	printf("Fin de l'affichage \n");
    }
     
     
    void ajouterEnTete(Liste **tete, int x){
     
    	Liste *nouvelElement = malloc(sizeof(Liste));
     
    	nouvelElement->valeur = x;
    	nouvelElement->suiv = *tete;
    	*tete = nouvelElement;
     
    }
     
    void ajouterEnQueue(Liste **tete, int x){
     
    	Liste *pp, *p, *nouvelElement;
    	p = *tete;
    	pp = p;
    	if(*tete == NULL){
    		//cas d'une liste vide
    		ajouterEnTete(tete, x);
    	}else{
    		while(p!=NULL){
    			pp = p;
    			p = p->suiv;
    		}
     
    		nouvelElement = malloc(sizeof(Liste));
    		nouvelElement->valeur = x;
    		if(nouvelElement == NULL){
    			printf("L'allocation a échouée");
    		return;
    		}
    		nouvelElement->suiv = NULL; //facultatif
    		pp->suiv = nouvelElement;
     
    	}
     
    }
     
    void insererEnOrdre(Liste **tete, int x){
     
    	Liste *p, *pp, *nouvelElement;
     
    	p = *tete;
    	pp = p;
    	//printf("(x, tete.val) = (%d , %d )\n", (*tete)->valeur, x);
    	if(*tete == NULL){
    				printf("1 ");
    		ajouterEnTete(tete, x);
    	}else{
    		while(p!=NULL && x > p->valeur){
    			pp = p;
    			p = p->suiv;
    		}
    		if(p!=NULL && x == p->valeur){
    			//on insert pas x ici, mais on peut bien choisir de l'inserer aussi
    			//dans ce cas on le fais dans le cas précédent
    			printf("%d existe déjà ",x);
    			return;
    		}else{
    			nouvelElement = malloc(sizeof(Liste));
    			nouvelElement->valeur = x;
    			if(p!=NULL && x < p->valeur){
    				//insertion de x avant p et après pp 
    				nouvelElement->suiv = p;
    				pp->suiv = nouvelElement;
    			}else{
    				//insertion en queue
    				//nouvelElement->suiv == NULL;
    				pp->suiv = nouvelElement;
    			}
    		}
    	}
     
    }
    1. Makefile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CC = gcc              
    CFLAGS = -Wall -O3    
     
    all : main
     
    main : main.o ListeChaineeSimple.o
    	$(CC) -o $@ $^
     
    %.o : %.c 
    	$(CC) $(CFLAGS) -o $@ -c $<
     
    clean :
    	rm -f main *.o
    1. main.c

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    #include "ListeChaineeSimple.h"
     
    int main(void){
     
    	printf("Manipulation de listes chainées \n");
     
    	Liste *maListe = NULL;
     
    	/*
    	ajouterEnTete(&maListe, 2); 
    	ajouterEnTete(&maListe, 3); 
    	ajouterEnTete(&maListe, 6); 
    	ajouterEnTete(&maListe, -1); 
     
     
    	ajouterEnQueue(&maListe, 3); 
    	ajouterEnQueue(&maListe, 0); 
    	ajouterEnQueue(&maListe, 5); 
    	ajouterEnQueue(&maListe, 7); 
     
    	*/
     
    	insererEnOrdre(&maListe, 60);
    	insererEnOrdre(&maListe, 20);
    	insererEnOrdre(&maListe, 15);
    	insererEnOrdre(&maListe, 100);
    	insererEnOrdre(&maListe, 15);
    	insererEnOrdre(&maListe, 10);
     
    	afficher(maListe); 
     
    return EXIT_SUCCESS;
    }
    Normalement les 2 premières fonctions marchent, mais vous pouvez bien apporter vos changements.
    merci de votre aide.

  4. #4
    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 : 67
    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 dialloma
    Voici le code complet.
    Dans les .h, il faut penser à mettre les prototypes... et à utiliser son compilateur plus sérieusement...

    http://emmanuel-delahaye.developpez....tm#cfg_compilo
    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
     
    Project   : Forums mem
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: listechaineesimple.c
    listechaineesimple.c:8: warning: no previous prototype for 'afficher'
    listechaineesimple.c:20: warning: no previous prototype for 'ajouterEnTete'
    listechaineesimple.c:30: warning: no previous prototype for 'ajouterEnQueue'
    listechaineesimple.c:57: warning: no previous prototype for 'insererEnOrdre'
    Compiling: main.c
    main.c: In function `main':
    main.c:26: error: implicit declaration of function `insererEnOrdre'
    main.c:26: warning: nested extern declaration of `insererEnOrdre'
    main.c:33: error: implicit declaration of function `afficher'
    main.c:33: warning: nested extern declaration of `afficher'
    Process terminated with status 1 (0 minutes, 4 seconds)
    2 errors, 6 warnings
    EDIT : en fait, il suffit d'inclure listechainees.h au lieu de listechaineessimple.h dans main.c et listechaineesimple.c.

    En fait, il n'y a aucun intérêt à séparer la structure dans un fichier .h différent. En principe, c'est un .h par source .c (ou groupe de sources si il en faut plusieurs, dans ce cas, il peut y avoir des .h 'internes').

    Concernant le code :

    • <malloc.h>, ça n'existe pas (vu du C standard).
    • La memoire n'est pas libérée.
    • La liste est bouclée, alors évidemment, on en sort jamais... Il faut que le dernier élément pointe sur NULL.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre du Club Avatar de dialloma
    Homme Profil pro
    Java / J2EE, PHP
    Inscrit en
    Août 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Java / J2EE, PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    excuse moi, les fichiers s'appellent ListeChaineeSimple.c et ListeChaineeSimple.h
    et nom ListeChainee.c et ListeChainee.h. C'est en postant que je me suis trompé dans le message que j'ai envoyé. Mais on pouvait bien le constater dans le Makefile. Comme je le disais, chez moi les 2 premières fonctions marchent bien. Donc le problème se trouve au niveau de la 3ème. Help me about it please . merci d'avance

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 161
    Points
    161
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		nouvelElement->valeur = x;
    		if(nouvelElement == NULL){
    			printf("L'allocation a échouée");
    		return;
    		}
    		nouvelElement->suiv = NULL; //facultatif
    		pp->suiv = nouvelElement;
    Ce ne serait pas mieux de tester si l'allocation est réussie avant d'assigner nouvelElement->valeur ?
    Pourquoi "nouvelElement->suiv = NULL" serait facultatif ?
    Que fais tu de l'ancienne valeur de "pp->suiv" ?

    Et pour ton problème, je te conseille de dérouler ton algorithme pour le cas où tu ajoute un élément en début de liste non vide.
    Ex: Liste contient [ 20, 40, 60, NULL ] et tu ajoute 10

  7. #7
    Membre du Club Avatar de dialloma
    Homme Profil pro
    Java / J2EE, PHP
    Inscrit en
    Août 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Java / J2EE, PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Volune, les 2 première fonctions marchent bien. J'ai déroulé les algo c bon. je les ai tester separement et ça marche. Tu peux les tester chez toi aussi. J'ai poster tous les fichiers et le Makefile qui va avec. Le problème c'est au niveau de la 3ieme, l'insertion en ordre.
    Par contre
    nouvelElement->valeur = x;
    if(nouvelElement == NULL){
    printf("L'allocation a échouée");
    return;
    }
    nouvelElement->suiv = NULL; //facultatif
    pp->suiv = nouvelElement;
    j'ai corrigé, merci.

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 161
    Points
    161
    Par défaut
    -_-'

    D'abord je repose ma question, pour le code que tu as corrigé : Que devient l'ancienne valeur de "pp->suiv" après la ligne "pp->suiv = nouvelElement;" ?

    Ensuite, imagine le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	insererEnOrdre(&maListe, 20);
    	insererEnOrdre(&maListe, 40);
    	insererEnOrdre(&maListe, 60);
    	insererEnOrdre(&maListe, 10); /*ici*/
    L'appel à "insererEnOrdre(&maListe, 10);" va bien effectuer l'oppération d'ajouter 10 au début de la liste [20 40 60], non ?
    Donc tu déroule cet appel à la main (tu reprend ta 3eme fonction et tu te demande ce qu'il se passe lors de cet appel). Ca devrait te montrer d'où vient le problème.

  9. #9
    Membre du Club Avatar de dialloma
    Homme Profil pro
    Java / J2EE, PHP
    Inscrit en
    Août 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Java / J2EE, PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Volune,
    d'abord, je m'excuse pour la réponse tardive. J'étais très malade les jours passés, j'étais très enrhumé maux de têtes etc...c'est pourquoi je n'ai pas pu répondre aussi vite. je viens de revoir mon ancien code et je me suis rendu compte qu'éffectivement il y a vait des cas que je n'avais pas traité telque celui que tu m'as signalé. je me suis referé de ton exemple pour rajouter le cas qui manquait, c'est à dire l'insertion en tête d'une liste non vide. Donc j'ai pu écrire le code qui suit et j'ai testé sur ton exemple ça marche bien. Donc je poste le code pour que tu me regarde s'il y a des éventuels bugs que je peux corriger et sinon des éventuels améliorations. Merci d'avance et bonne fêtes de fin d'année

    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
    void ajouterEnOrdre(Liste **tete, int x){
     
    	Liste *p, *pp, *nouvelElement;
     
    	nouvelElement = malloc(sizeof(Liste));
    	nouvelElement->valeur = x;
     
    	if(*tete == NULL){
    		//cas d'une liste vide
    		printf("cas d'une liste vide \n");
    		*tete = nouvelElement;
    	}else{
     
    		printf("Cas liste non vide \n");
    		//parcours pour trouver la bonne place
    		p = *tete;
    		pp = p;
    		while(p!=NULL && p->valeur < x){
    			pp = p;
    			p = p->suiv;
    		}//while
     
    		if(p==NULL){
    			printf("Insertion en fin de liste \n");
    			pp->suiv = nouvelElement;
    		}else if(p!=NULL && p->valeur >= x){
    			//insertion entre pp et p
    			printf("Insertion en entre pp et p \n");
    			if(p==pp){//cas d'une insertion en tête de liste
    				nouvelElement->suiv = *tete;
    				*tete = nouvelElement;
    			}else{
    				nouvelElement->suiv = p;
    				pp->suiv = nouvelElement;
    			}
     
    		} 
    	}	
    }

  10. #10
    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
    sauf erreur, nouvelElement->suiv n'est pas initialisé à NULL en cas d'insertion en fin de liste ou si la liste était vide
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  11. #11
    Membre du Club Avatar de dialloma
    Homme Profil pro
    Java / J2EE, PHP
    Inscrit en
    Août 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Java / J2EE, PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par diogene
    sauf erreur, nouvelElement->suiv n'est pas initialisé à NULL en cas d'insertion en fin de liste ou si la liste était vide
    L'exemple suivant marche bien pourtant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ajouterEnOrdre(&maListe, 20);
    ajouterEnOrdre(&maListe, 60);
    ajouterEnOrdre(&maListe, 40);
    ajouterEnOrdre(&maListe, 10);
    ajouterEnOrdre(&maListe, 70);
    il donne le résultat suivant:

    1. cas d'une liste vide
    2. Cas liste non vide
    Insertion en fin de liste
    2. Cas liste non vide
    Insertion en entre pp et p
    2. Cas liste non vide
    Insertion en tête d'une liste non vide
    2. Cas liste non vide
    Insertion en fin de liste
    Début de l'affichage
    10
    20
    40
    60
    70
    Fin de l'affichage
    Et je crois que nous retrouvons tous les cas possibles d'insertion. Je ne vois à quel niveau se trouve le problème.

    Merci de me donner un exemple concret.
    Bonne fêtes

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 136
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par diogene
    sauf erreur, nouvelElement->suiv n'est pas initialisé à NULL en cas d'insertion en fin de liste ou si la liste était vide
    Bonsoir,
    Il serait prudent de mettre nouvelElement->suiv à NULL au moment de la création de nouvelElement.

  13. #13
    Membre du Club Avatar de dialloma
    Homme Profil pro
    Java / J2EE, PHP
    Inscrit en
    Août 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Java / J2EE, PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par igorIgor
    Bonsoir,
    Il serait prudent de mettre nouvelElement->suiv à NULL au moment de la création de nouvelElement.
    Je croyais que quand on crée un espace mémoire de cette façon , nouvelElement->suiv est automatiquement à NULL. Peut être que je me trompe. Si c'est le cas, veuillez me le dire s'il vous plaît, comme ça je vais corriger dans l'avenir. Merci encore une fois et bonne et heureuse année 2007;

  14. #14
    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 : 67
    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 dialloma
    Je croyais que quand on crée un espace mémoire de cette façon , nouvelElement->suiv est automatiquement à NULL.
    La zone allouée par malloc() n'est pas initialisée. Même si elle l'était (calloc(), par exemple), rien ne prouve que l'initialisation réalisée (tous les bits à 0) corresponde à un NULL pour un pointeur.

    L'initialisation doit être explicite. On peut utiliser la copie d'un objet correctement initialisé à 0 comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       T *p = malloc (sizeof *p);
     
       if (p != NULL)
       {
          /* objet de reference dont tous les elements sont a 0 */
          static const T z = {0};
     
          /* copie */
          *p = z;
     
          /* maintenant tous les elements de la zone allouee sont a 0 */
       }
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Membre du Club Avatar de dialloma
    Homme Profil pro
    Java / J2EE, PHP
    Inscrit en
    Août 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Java / J2EE, PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Merci à tout le monde. Ce sujet peut être considéré comme résolu je crois. Merci à tous et bonne année

Discussions similaires

  1. Problèmes avec les pointeurs
    Par dlaumor dans le forum C
    Réponses: 8
    Dernier message: 17/10/2007, 14h06
  2. Problème avec les pointeurs intelligents de boost.
    Par Le Barde dans le forum Boost
    Réponses: 2
    Dernier message: 05/09/2007, 12h47
  3. Petit problème avec les pointeurs et variable
    Par mitherkiller dans le forum C
    Réponses: 5
    Dernier message: 09/03/2007, 22h05
  4. probléme avec les pointeurs
    Par killer_instinct dans le forum C++
    Réponses: 6
    Dernier message: 11/12/2006, 11h37
  5. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31

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