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 :

Adresse d'un tableau de char


Sujet :

C

  1. #1
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut Adresse d'un tableau de char
    Bonjour

    Ce bout de code me pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char txt[50];
    printf("Saisir la clef secrete : "); /* Saisie de la clef secrete */ 
    scanf("%s",&txt);
    Que l'on tape scanf("%s", txt); ou scanf("%s", &txt); il n'y a pas de différence, aucun warning ni erreur à la compile (avec Visual C6 ou Borland C++), et la chaîne est rangée dans txt. Pourquoi ?
    Je me souviens d'un compilo, "pwb" sous OS2 je crois, qui me signalait au moins un warning en disant que prendre l'adresse d'un tableau est inopérant, pourquoi ne le fait-il plus ?

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Juin 2003
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    mettre "txt" revient a mettre "&text[0]"

    le pointeur du premier caractere du tableau

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Oui ça d'accord.

    Ce que je ne comprends pas c'est pourquoi il n'y a pas de plante lorsqu'on met &txt, car en bonne logique (du moins la mienne, d'après mes connaissances en C) &txt devrait être du type char ** et donc si on y range 100 car çà devrait péter !

  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 : 68
    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 Re: Adresse d'un tableau de char
    Citation Envoyé par Trap D
    Ce bout de code me pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char txt[50];
    printf("Saisir la clef secrete : "); /* Saisie de la clef secrete */ 
    scanf("%s",&txt);
    Que l'on tape scanf("%s", txt); ou scanf("%s", &txt); il n'y a pas de différence, aucun warning ni erreur à la compile (avec Visual C6 ou Borland C++), et la chaîne est rangée dans txt. Pourquoi ?
    Je me souviens d'un compilo, "pwb" sous OS2 je crois, qui me signalait au moins un warning en disant que prendre l'adresse d'un tableau est inopérant, pourquoi ne le fait-il plus ?
    scanf() est une fonction 'variadic' (à nombre et type indéterminé de paramètres). Certains compilateurs comme gcc vérifient le type par rapport à la chaine de paramètrage, d'autres non.

    C'est un des arguments contre les fonctions variadics (absence de vérification des paramètres).

    Dans tous les cas, il est préférable de saisir une ligne avec fgets(), ce qui scelle le problèmes de scanf(). En effet, 'scanf ("%s", buf)' est aussi dangereux que 'gets(buf)'.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Oui, je suis tout à fait d'accord avec celà, mais cà ne répond pas à ma question :

    Ce que je ne comprends pas c'est pourquoi il n'y a pas de plante lorsqu'on met &txt, car en bonne logique (du moins la mienne, d'après mes connaissances en C) &txt devrait être du type char ** et donc si on y range 100 car çà devrait péter !

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Trap D
    Oui, je suis tout à fait d'accord avec celà, mais cà ne répond pas à ma question :

    Ce que je ne comprends pas c'est pourquoi il n'y a pas de plante lorsqu'on met &txt, car en bonne logique (du moins la mienne, d'après mes connaissances en C) &txt devrait être du type char ** et donc si on y range 100 car çà devrait péter !
    Salut,

    scanf() est une fonction qui utilises des arguments multiples...
    Elle est déclaré comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int scanf (const char *format, ...);
    Ca veut dire qu'elle prend une chaine de caractères puis 0 ou plusieurs paramètres de type quelconques...
    Du coups le compilateur ne verifie pas les paramètres vu qu'il peut y avoir n'importe quoi (même si scanf() ne prend que des pointeur)...
    Au passage j'ai essayé avec gcc -Wall fichier.c et il me met un warning du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    warning: unsigned int format, pointer arg (arg 2)
    car il analyse le premier paramètre de scanf() pour vérifier les autres...


    Ensuite pourquoi ca marche ?

    En C, un tableau est un pointeur sur le premier élément du tableau.
    donc comme ca a été dit txt est égal à &txt[0]...
    Mais l'adresse du tableau (&txt) est aussi égal au tableau lui-même.
    Donc &txt == txt

    Pour t'en convaincre essaye le code suivant qui affiche l'adresse des pointeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char txt[50];
    printf ("%x\n", txt);
    printf ("%x\n", &txt);
    Enfin, si tu aurais déclaré ton txt comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *txt = (char*)malloc(sizeof(char)*50);
    Cela aurais planté car ici txt != &txt.
    txt = Adresse du premier élément alloué par malloc().
    &txt = Adresse du pointeur lui-même.

    voilà j'espere avoir été clair...

    a++

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Merci

    Mais l'adresse du tableau (&txt) est aussi égal au tableau lui-même.
    Donc &txt == txt
    C'est un peu ce que je soupçonnais.
    C'est quand même un peu curieux, au premier abord, pour un tableau, la valeur de la variable est sa propre adresse !

  8. #8
    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 : 68
    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 Trap D
    Mais l'adresse du tableau (&txt) est aussi égal au tableau lui-même.
    Donc &txt == txt
    C'est un peu ce que je soupçonnais.
    C'est quand même un peu curieux, au premier abord, pour un tableau, la valeur de la variable est sa propre adresse !
    Un tableau est une séquence de variables identiques. Le nom du tableau est un pointeur constant (non modifiable) dont la valeur est l'adresse du premier élément du tableau.

    On peut donc affirmer que tab == tab + 0 == &tab[0]

    Par contre, l'adresse de tab est bien identique en valeur, mais son type est différent (pointeur sur tableau au lieu de pointeur sur element):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main (void)
    {
       char tab[10];
     
       char *pa = tab;              /* ok */
       char *pb = &tab;             /* error */
       char (*pc)[10] = &tab;       /* ok */
       char (*pd)[9] = &tab;        /* error */
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Compiling MAIN.C:
     Warning MAIN.C 6: Suspicious pointer conversion
     Warning MAIN.C 8: Suspicious pointer conversion
     Linking EXE\PROJ.EXE:

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Merci pour tous vos éclaircissements.
    Je mourrais moins idiot

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/10/2005, 16h10
  2. decalage à gauche sur une tres grand tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 10
    Dernier message: 14/07/2005, 23h40
  3. retrouver unesuite de caractères dans un tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 17
    Dernier message: 13/07/2005, 00h43
  4. Ansistring et tableau de char
    Par rabbi_jaccob dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/12/2004, 12h51
  5. Réponses: 4
    Dernier message: 10/10/2003, 19h04

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