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 de pointeur


Sujet :

C

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 2
    Points : 5
    Points
    5
    Par défaut Problème de pointeur
    Bonjour,
    Je rencontre un problème lors de l’exécution de mon code source pour le projet informatique. J'aurais besoin de votre aide svp.
    Sur la 1ere image jointe, vous pouvez voir que j'affecte l'adresse de 2 variables score_1 et score_2 à 2 pointeurs score_a et score_b. Ces variables ont été initialisées à 0.
    J'affiche ensuite les valeurs des variables pointées via un déréférencement des pointeurs. Sur l'invite de commande, on voit que cela fonctionne, "0 0" apparait.
    J'appelle après une fonction saisirCombinaison qui ne touche absolument pas à ces pointeurs ou variables pointées (voir image 2), puis je ré-affiche les valeurs des variables pointées via un déréférencement des pointeurs. Cependant à ce moment là on voit dans l'invite de commande que des valeurs différentes de 0 0 s'affichent, puis que les adresses contenues dans les pointeurs ne sont pas celles des variables qui devaient être pointées.
    Je ne comprends pas comment c'est possible.
    Merci par avance
    Images attachées Images attachées   

  2. #2
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Bonjour,

    on ne peut pas dire grand chose avec ce que tu montres d'un projet qui semble être important. Mais un bon conseil : apprends à utiliser des outils comme un debuger (gdb par exemple) et un memory profiler (valgrind). Accessoirement, utilse les balise code pour poster du code …

    Le bug que tu décris est certainement dû à un écrasement de la mémoire (tes scanf qui remplissent une variable trop petite?). Pour débusquer ces erreurs il faut commencer par compiler ton projet en mode debug (en ajoutant l'option -g si tu utilises clang ou gcc). Ensuite tu exécutes ton programme avec valgrind en lui fournissant les options --leak-check=full --track-origins=yes --show-reachable=yes.

    Par exemple si on prend 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
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
    	char foo[5];
    	char bar[]="Hello world !";
     
    	printf("bar = \"%s\"\n", bar);
    	strcpy(foo,bar);
    	printf("bar = \"%s\"\n", bar);
     
    	return 0;
    }
    Ce code contient une erreur. La compilation ne donne aucun message, mais à l'exécution il y a comme un souci une variable jamais modifée explicitement se retrouve modifiée !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ gcc -Wall -Wextra -g -o erreur erreur.c 
    $ ./erreur 
    bar = "Hello world !"
    bar = " world !"
    Toutefois, si on utilise ensuite valgrind :
    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
     valgrind --leak-check=full --track-origins=yes --show-reachable=yes ./erreur 
    ==400595== Memcheck, a memory error detector
    ==400595== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
    ==400595== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
    ==400595== Command: ./erreur
    ==400595== 
    bar = "Hello world !"
    ==400595== Source and destination overlap in strcpy(0x1fff000575, 0x1fff00057a)
    ==400595==    at 0x484BF00: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==400595==    by 0x1091B8: main (erreur.c:10)
    ==400595== 
    bar = " world !"
    ==400595== 
    ==400595== HEAP SUMMARY:
    ==400595==     in use at exit: 0 bytes in 0 blocks
    ==400595==   total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated
    ==400595== 
    ==400595== All heap blocks were freed -- no leaks are possible
    ==400595== 
    ==400595== For lists of detected and suppressed errors, rerun with: -s
    ==400595== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
    l'erreur est immédiatement pointée : dans main en ligne 10 un appel à strcpy écrase la source …

    voilà …

    si tu n'as pas ou ne peux pas utiliser valgrind tu as d'autres options comme demander à ton compilo de rajouter du code de vérification au runtime :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ gcc -Wall -Wextra -fsanitize=address  -g -o erreur erreur.c 
    $ ./erreur 
    bar = "Hello world !"
    =================================================================
    ==400876==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffe2827a1b5 at pc 0x7ff914c77b1b bp 0x7ffe2827a180 sp 0x7ffe28279928
    WRITE of size 14 at 0x7ffe2827a1b5 thread T0
        #0 0x7ff914c77b1a in __interceptor_strcpy /usr/src/debug/gcc/libsanitizer/asan/asan_interceptors.cpp:440
        #1 0x55db6046d2fc in main /home/fred/Desktop/erreur.c:10
        #2 0x7ff914a4530f in __libc_start_call_main (/usr/lib/libc.so.6+0x2d30f)
        #3 0x7ff914a453c0 in __libc_start_main@GLIBC_2.2.5 (/usr/lib/libc.so.6+0x2d3c0)
        #4 0x55db6046d0e4 in _start (/home/fred/Desktop/erreur+0x10e4)
     
    …
    C'est peut-être un peu plus confus, mais le résultat est le même → l'erreur est pointée et tracée.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 2
    Points : 5
    Points
    5
    Par défaut
    Merci bcp pour votre aide, j'ai pu résoudre mon problème. Effectivement j'avais oublié de laisser une place dans les chaines de caractères que je saisissais pour le caractère de combinaison \0.

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

Discussions similaires

  1. Problème de pointeurs..embrouillé
    Par Frenchy dans le forum C++
    Réponses: 11
    Dernier message: 10/03/2005, 16h33
  2. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57
  3. Problème de pointeur
    Par toma_lille dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2004, 21h26
  4. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50
  5. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39

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