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 & tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Par défaut pointeur & tableau
    Bonjour, qqun pourrait il m'expliquer pourquoi ce code ne fonctionne pas,

    Pourquoi ce code ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    main()
    { 
    char* nom;
     
    printf("nom: ");
    scanf("%s",nom);
    printf("le nom est: %c\n",*nom); /* 1*/
    system("pause");
    }
    1 Ne devrait il pas afficher le premier caractere du nom stocké à l'adresse nom?


    alors que ce code fonctionne....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    main()
    { 
    char nom[25];
     
    printf("nom: ");
    scanf("%s",nom);
    printf("le nom est: %c\n",nom[0]);/*2*/
    system("pause");
    }
    2 Ici, la première lettre s'affiche...

    Merci

  2. #2
    Membre éclairé
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Par défaut
    Salut,

    Ton premier code est absurde : tu passes à scanf une valeur indéterminée !
    Où as-tu initialisé ton pointeur de caractère ?
    Si on essaie de saisir une chaîne au clavier, on fait fatalement planter le programme (on écrit en mémoire, mais on ne sait pas où).

    Le second programme fonctionne, car tu écris dans de la mémoire que tu as bien allouée au programme (tableau).

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Par défaut
    Je t'avoue que je n'ai pas compris, je suis novice en programmation, certaines choses m'échappent...

    1) En quoi le progamme, lorque j'utilise un tableau, sait où j'écris mon code?

    2) Faut il comprendre qu'il n'est pas nécéssaire d'initialiser un tableau, alors que c'et obligatoire pour un pointeur?

    3) comment afficher, avec ce type de programme, le nom entier saisit au clavier uniquement avec la notation pointeur?

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Il veut dire que ton pointeur ne pointe pas sur une zone memoire pouvant accueillir les caracteres ecrits par scanf

    http://ccedille.canalblog.com/archiv...5/4541174.html

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 35
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // printf("le nom est: %s\n",*nom);
    // A remplacer par :
    printf("le nom est: %s\n",nom);
    Tu dois donner en paramètre à printf l'adresse de la 1ère lettre et non sa valeur. Mais je trouve bizarre que ton code fonctionne sans allocation de mémoire! Je pense qu'il serait mieux de réserver de la mémoire pour y enregistrer ta chaîne de caractère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    main()
    {
    char* nom;
     
    nom=malloc(25*sizeof(char));
     
    printf("nom: ");
    scanf("%s",nom);
    printf("le nom est: %s\n",*nom);
    system("pause");
    free(nom);
    }

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Par défaut
    Merci bcp Dud225,

    mais qqch m'échappe....

    Si à la place de travailler avec du %s j'utilise du %c, autrement dit je pointe sur un caractère, pourquoi suis je obligé de mettre la valeur du pointeur (*nom) en paramètre de printf, et non pas l'adresse comme pour une chaine de caractère ?

  7. #7
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Bein, ya besoin de l'adresse du premier caractere, dans le cas du format de chaine (%s), afin d'acceder aux autres caracteres (qui sont à la suite du premier)
    Dans le cas du format caractere (%c), ya juste besoin de la valeur du caractere, tout simplement

    Pour ta question initiale, cf l'autre topic

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par laurent933
    Bonjour, qqun pourrait il m'expliquer pourquoi ce code ne fonctionne pas,
    <...>
    alors que celui ci fonctionne :
    <...>
    Les deux codes sont aussi mauvais :

    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
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:2: warning: return type defaults to `int'
    main.c:2: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:5: warning: implicit declaration of function `printf'
    main.c:6: warning: implicit declaration of function `scanf'
    main.c:7: warning: format argument is not a pointer (arg 2)
    main.c:8: warning: implicit declaration of function `system'
    main.c:9: warning: control reaches end of non-void function
    main.c:3: warning: 'nom' might be used uninitialized in this function
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 5 seconds)
    0 errors, 8 warnings
    et 'celui qui marche' :
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:2: warning: return type defaults to `int'
    main.c:2: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:5: warning: implicit declaration of function `printf'
    main.c:6: warning: implicit declaration of function `scanf'
    main.c:8: warning: implicit declaration of function `system'
    main.c:9: warning: control reaches end of non-void function
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 2 seconds)
    0 errors, 6 warnings
    Bref, il faut poster du code complet. Il manque les headers...

    Si on corrige le premier code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
     
    int main (void)
    {
       char *nom;
     
       printf ("nom: ");
       scanf ("%s", nom);
       printf ("le nom est: %s\n", *nom);
       return 0;
    }
    On constate qu'il reste de sérieuses difficultés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:9: warning: format argument is not a pointer (arg 2)
    main.c:5: warning: 'nom' might be used uninitialized in this function
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 2 warnings
    Je pense que les remarques du compilateur sont assez claires.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Par défaut
    Est il exact de dire

    1) il faut allouer de la mémoire dés que l'on travaille avec des tableaux :
    Pour la notation pointeur cela se traduit par la nécéssité d'utiliser la fonction malloc, et pour la notation tableau ceci est sous entendu lorsque l'on écrit

    on reserve n*sizeof(type) en mémoire.

    2) L'allocation de mémoire est sous entendu lorsque l'on travaille avec des entiers, des caractères, des floats...., lors de la déclaration.

    Merci encore, et dslé si mes questions vous paraissent...stupide

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par laurent933
    Est il exact de dire

    1) il faut allouer de la mémoire dés que l'on travaille avec des tableaux :
    Charabia. Un tableau est un objet comme un autre. Il doit être défini d'une manière ou d'une autre.
    Pour la notation pointeur cela se traduit par la nécéssité d'utiliser la fonction malloc, et pour la notation tableau ceci est sous entendu lorsque l'on écrit
    on reserve n*sizeof(type) en mémoire.
    Si on utilise un pointeur, celui-ci doit pointer sur la zone mémoire qui contient le tableau. Cette zone peut avoir été crée statiquement :
    ou dynamiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T *p = malloc (sizeof *p * N);
    2) L'allocation de mémoire est sous entendu lorsque l'on travaille avec des entiers, des caractères, des floats...., lors de la déclaration.
    Oui. On dit qu'elle est implicite. Mais il en est de même pour les pointeurs ! Lorsqu'on défini un pointeur, l'espace mémoire de l'objet pointeur est réservé automatiquement.

    Simplement, comme tout objet nouvellement crée, il vaut soit 0 si il est statique, soit une valeur indéfinie si il est dynamique. c'est pourquoi utiliser un pointeur non initialisé conduit à un comportement indéfini.

    La bonne règle d'usage est de toujours donner une valeur connue aux pointeurs :
    • soit NULL car c'est testable
    • soit sa valeur nominale qui peut avoir 4 origines (en C standard) :
      • L'adresse d'une variable existante
      • La valeur retournée par malloc() (ou calloc() ou realloc())
      • La valeur d'un pointeur valide
      • Si il est de type void ou FILE, la valeur retournée par fopen().


    http://emmanuel-delahaye.developpez.....htm#pointeurs

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Par défaut
    Ok,

    Merci à vous tous pour votre disponibilité, et plus particulièrement à Emmanuel Delahaye !

    @+

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 20/10/2006, 13h19
  2. Accès le plus rapide: Pointeur ou tableau?
    Par homeostasie dans le forum C
    Réponses: 21
    Dernier message: 01/09/2006, 14h08
  3. [VB.NET] Pointeur vers tableau
    Par b_lob dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/08/2006, 16h06
  4. convertion pointeur vers tableau
    Par gdpasmini dans le forum C++
    Réponses: 2
    Dernier message: 30/03/2006, 00h34
  5. Pointeur et TAbleau
    Par melmouj dans le forum C
    Réponses: 20
    Dernier message: 25/09/2005, 16h13

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