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 de chaînes et chaînes de type tableau


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 3
    Par défaut Pointeur de chaînes et chaînes de type tableau
    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>
     
    char *A[] = {"un", "deux", "trois"};
    char *strtmp;
     
    main()
    {
      strcpy (strtmp, A[2]);
      printf("%s", strtmp);
     
      getch();
    }

    Bonjour à tous,

    D'après plusieurs personne à qui j'ai demandé de l'aide ce programme est écrit
    correctement mais il ne fonctionne pas car '*strtmp' pointe sur une zone non définie et je doit l'initialiser (ex : strtmp[10]).

    Ma question est la suivante, pourquoi dans le prototype de la fonction strcpy(),
    le premier argument est de type pointeur de char alors que je doit (dans ce cas là) utiliser une chaîne de type tableau pour l'initialisation.
    Je souhaiterai utilisé un pointeur de char et non une chaîne de type tableau qui m'oblige à utiliser les indices.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    La réponse est simple : un tableau est un pointeur. La seule différence c'est qu'il pointe sur plus d'une variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char tab[10];
     
    // Pour accéder au 1er élément on fait habituellement
    tab[0] = 'a';
     
    // Mais on pourrait tout aussi bien faire
    *tab = 'a';
     
    // Et pareil pour les autres éléments
    *(tab + 3) = 'a'; // équivalent à tab[3] = 'a'
    Inutile donc de faire la distinction entre les 2 dans ton cas.

  3. #3
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut Re: Pointeur de chaînes et chaînes de type tableau
    Salut

    Donc comme écrit ci-dessus ton programme devient
    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
    #include <stdio.h>
    #include <string.h>
     
    char *A[] = {"un", "deux", "trois"};
    char *strtmp;
     
    main()
    {
      strtmp =  A[0] ;
      printf("%s", strtmp) ;  // Affiche "un"
     
      strtmp =  A[1] ;
      printf("%s", strtmp) ;  // Affiche "deux"
     
      strtmp =  A[2] ;
      printf("%s", strtmp) ;  // Affiche "trois"
     
      getch();
    }
    Maintenant si tu veux directement écrire "un" dans strmp, il te faudra lui allouer de l'espace mémoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    #include <string.h>
     
    char *strtmp;
     
    main()
    {
      strtmp = malloc(3*sizeof(char)) ;  // Allocation pour 3 char 'u'+'n'+'\0'
      if(strtmp==NULL) exit(0) ;  // Erreur d'allocation mémoire
      strcpy(strtmp, "un") ;
      printf("%s", strtmp) ;  // Affiche "un"
      free(strtmp) ;  // Libère la mémoire utilisée
    }
    Voila...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 3
    Par défaut
    Dans ce cas quelle différence il ya t-il a entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     strtmp=A[2] et strcpy(strtmp, A[2])
    Dans le cas de strtmp=A[2] , pourquoi n'est-on pas obligé d' allouer l'espace mémoire neccessaire ?

  5. #5
    Membre chevronné
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Par défaut
    Citation Envoyé par testc
    Dans ce cas quelle différence il ya t-il a entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     strtmp=A[2] et strcpy(strtmp, A[2])
    Dans le cas de strtmp=A[2] , pourquoi n'est-on pas obligé d' allouer l'espace mémoire neccessaire ?
    A[2] est un pointeur vers une zone mémorie. En faisant strtmp=A[2], tu affecte la valeur de ce pointeur au pointeur strtmp. Ce dernier (strtmp), pointe donc après cette instruction vers le même emplacement mémoire que A[2]: il n'y a donc pas d'allocation mémoire à faire, on se retrouve simpelment avec deux pointeurs sur le même emplacement mémoire.
    En revanche, strcpy(strtmp, A[2]) duplique l'emplacement mémoire pointé par A[2] dans celui pointé par strtmp. On se retrouve avec deux emplacement mémoire différents, mais contenant les mêmes données (à savoir, dans l'exemple, un tableau de caractères c'est à dire une chaîne). Il est donc nécessaire d'allouer assez de place en mémoire au niveau du pointeur strtmp.

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par testc
    Dans ce cas quelle différence il ya t-il a entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     strtmp=A[2] et strcpy(strtmp, A[2])
    Dans le cas de strtmp=A[2] , pourquoi n'est-on pas obligé d' allouer l'espace mémoire neccessaire ?
    Dans le premier cas (strtmp=A[2], il faudrait plutot A+2 ou &A[2] d'ailleurs), tu fais pointer strtmp vers A[2], c'est a dire que tu mets dans strtmp l'adresse memoire de A[2]. Il n'est donc pas necessaire de reserve la memoire, puisqu'elle l'est deja par A.

    Dans le second cas (qui serait d'ailleurs strcpy(strtmp,&A[2]) ou strcpy(strtmp,A+2) et non strcpy(strtmp,A[2]), tu cherches a copier la chaine commencant a l'adresse A+2 (c'est a dire l'ensemble des octets a partir de l'adresse A+2 jusqu'au premier octet a \0) a l'adresse pointe par strtmp, il faut donc qu'a l'adresse pointee par strtmp tu ai une zone allouee pour resevoir ce que tu copies.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 3
    Par défaut
    Ok, c'est vachement plus clair maintenant.

    Merci à tous.

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

Discussions similaires

  1. Scinder les chaînes de caractère d'un tableau
    Par Norum1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/12/2007, 15h19
  2. Remplir une chaîne de caractère dans un tableau
    Par Windsor123 dans le forum C
    Réponses: 4
    Dernier message: 03/11/2007, 01h29
  3. Réponses: 2
    Dernier message: 19/10/2007, 14h39
  4. Réponses: 4
    Dernier message: 19/10/2007, 09h46
  5. Pointeur générique et liste chaînée
    Par jro-daemon dans le forum C
    Réponses: 9
    Dernier message: 23/02/2007, 14h06

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