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 :

Utilisation de tableaux de caractères comme s'ils étaient des pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2011
    Messages : 7
    Par défaut Utilisation de tableaux de caractères comme s'ils étaient des pointeurs
    Bonjour,

    Je coince carrément...

    Par défaut, pour les variables dont je connais la longueur, je préfère les tableaux de caractères (déclarés "char tab[30]" par exemple) plutôt que les pointeurs.

    Les strcpy, strcmp, etc... fonctionnent nickel !

    Par contre, si je crée une fonction perso qui accepte du *char en paramètre ou qui retourne du *char, c'est la galère si j'utilise mes fameux tableaux dans ces fonctions perso.
    Le compilateur me sort des "cannot convert (char*) to (char [30])".

    Ok, je caste : j'obtiens toutes sortes de message du même genre, pas toujours exactement les mêmes, mais ça ne marche jamais !

    Je me souviens avoir entendu dire qu'il existait une écriture permettant de manipuler (ou présenter) un char[] comme un pointeur char *.

    Mais comment ?

    Merci pour votre aide !

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Finelizzyx Voir le message
    Bonjour,

    Par défaut, pour les variables dont je connais la longueur, je préfère les tableaux de caractères (déclarés "char tab[30]" par exemple) plutôt que les pointeurs.
    Salut

    C'est tout à fait ton droit

    Citation Envoyé par Finelizzyx Voir le message
    Les strcpy, strcmp, etc... fonctionnent nickel !
    Normal (pourvu que ton tableau contienne un '\0')...

    Citation Envoyé par Finelizzyx Voir le message
    Par contre, si je crée une fonction perso qui accepte du *char en paramètre ou qui retourne du *char, c'est la galère si j'utilise mes fameux tableaux dans ces fonctions perso.
    Le compilateur me sort des "cannot convert (char*) to (char [30])".
    Normal. Tu peux copier du char[30] dans du char* mais pas l'inverse car un tableau est quelque chose d'invariant. Toutefois, tu peux copier le contenu d'un char* dans un char[30]
    Code c : 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
    char *fct(...)
    {
        static char *pt="Hello";
        return pt;
    }
    
    int main()
    {
         char tab[30];
         char *tmp;
    
         // Exemple de copie de char[] dans char*
         tmp=tab; 
    
         // Tentative de copie de char* dans char[]
         tab=tmp;     // Ne fonctionne pas !!!
    
         // Copie d'une chaine contenue dans un char* dans un char[]
         strcpy(tab, fct(...));
    }

    Citation Envoyé par Finelizzyx Voir le message
    Ok, je caste : j'obtiens toutes sortes de message du même genre, pas toujours exactement les mêmes, mais ça ne marche jamais !

    Je me souviens avoir entendu dire qu'il existait une écriture permettant de manipuler (ou présenter) un char[] comme un pointeur char *.
    Exact. Comme je te l'ai dit, un char[] peut être vu comme un char* mais pas l'inverse !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2011
    Messages : 7
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Normal (pourvu que ton tableau contienne un '\0')...
    C'est le cas. Soit les fonctions "native" du C s'en charge, soit je m'en occupe personnellement.

    Néanmoins, merci pour le conseil ; on est jamais trop prudent en C !

    Normal. Tu peux copier du char[30] dans du char* mais pas l'inverse car un tableau est quelque chose d'invariant. Toutefois, tu peux copier le contenu d'un char* dans un char[30]
    Code c : 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
    char *fct(...)
    {
        static char *pt="Hello";
        return pt;
    }
    
    int main()
    {
         char tab[30];
         char *tmp;
    
         // Exemple de copie de char[] dans char*
         tmp=tab; 
    
         // Tentative de copie de char* dans char[]
         tab=tmp;     // Ne fonctionne pas !!!
    
         // Copie d'une chaine contenue dans un char* dans un char[]
         strcpy(tab, fct(...));
    }
    Ca marche nickel ! Merci !!

    N'empêche : je me demande comment ces fonctions acceptent indifféremment du char* et du char[], du const char*... C'est justement cela que je voulais imiter.

    J'ai compris quand une affectation "pointeur" était possible (uniquement dans le sens tableau => pointeur). En fait, le nom utilisé seul de la variable tableau retourne l'adresse de l'entrée du tableau, mais ça reste un tableau.

    Par ailleurs, le code que tu as posté appelle chez moi une autre question : quand on souhaite qu'une fonction retourne du char*, on déclare un pointeur local à la fonction, on alloue de la mémoire à ce pointeur (par valorisation ou par une fonction malloc) et on retourne ce pointeur.

    Comment libérer la mémoire allouée au pointeur ? Dans la fonction appelante après retour et utilisation de la valeur ? parce qu'à force, on va en bouffer le mémoire si la fonction est appelée des centaines de fois !!

    Encore merci pour ton aide !

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Finelizzyx Voir le message
    Par ailleurs, le code que tu as posté appelle chez moi une autre question : quand on souhaite qu'une fonction retourne du char*, on déclare un pointeur local à la fonction, on alloue de la mémoire à ce pointeur (par valorisation ou par une fonction malloc) et on retourne ce pointeur.
    Généralement oui.

    Citation Envoyé par Finelizzyx Voir le message
    Comment libérer la mémoire allouée au pointeur ? Dans la fonction appelante après retour et utilisation de la valeur ? parce qu'à force, on va en bouffer le mémoire si la fonction est appelée des centaines de fois !!
    Exact. Ton problème est d'ailleurs le même si tu appelles malloc() sans libérer la zone allouée.

    Donc pour faire simple, tu dois considérer ta fonction qui te renvoie un char* exactement comme un malloc(). D'ailleurs, si tu réfléchis bien, ce qu'elle te renvoie c'est bien un truc alloué quelque part (en aval) par malloc(). Donc tu conserves précieusement ce qu'elle t'a renvoyé et quand tu n'en as plus besoin, tu le libères par free().
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre du Club
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2011
    Messages : 7
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Exact. Ton problème est d'ailleurs le même si tu appelles malloc() sans libérer la zone allouée.

    Donc pour faire simple, tu dois considérer ta fonction qui te renvoie un char* exactement comme un malloc(). D'ailleurs, si tu réfléchis bien, ce qu'elle te renvoie c'est bien un truc alloué quelque part (en aval) par malloc(). Donc tu conserves précieusement ce qu'elle t'a renvoyé et quand tu n'en as plus besoin, tu le libères par free().
    Je n'ai jamais considéré ce phénomène... Ou plutôt si : il me revient en mémoire (si je puis dire ! ) en te lisant ; voilà bien 15 ans que je n'avais pas retouché du C et j'avais envie de m'y remettre... Je crois que mon utilisation de tableaux de caractères viens de là : il n'y a rien à libérer ; quand la portée du tableau est dépassée, il est automatiquement libéré.

    Un code du style :

    char *ptr;
    ptr = strstr("Bonjour les gars !", "gars");


    m'a alloué à mon insu de la RAM à mon pointeur ptr que je dois libérer dès que nécessaire, c'est ça ?

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Finelizzyx Voir le message
    Un code du style :

    char *ptr;
    ptr = strstr("Bonjour les gars !", "gars");


    m'a alloué à mon insu de la RAM à mon pointeur ptr que je dois libérer dès que nécessaire, c'est ça ?
    Là non. Car strstr() te renvoie l'emplacement de la première chaine où commence la seconde. Or la première chaine étant en statique, elle n'a pas été allouée donc aucune de ses adresses n'a besoin d'être libérée.

    En revanche, une fonction comme strdup() qui crée une nouvelle chaine fait appel (à un moment donné) à malloc() donc le pointeur qu'elle te renvoie doit être libéré à un moment où à un autre.

    Citation Envoyé par Finelizzyx Voir le message
    : il n'y a rien à libérer ; quand la portée du tableau est dépassée, il est automatiquement libéré.
    Ce qui n'est pas alloué par malloc() n'a pas besoin d'être libéré. Il le sera tout seul quand effectivement sa portée sera dépassée.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre du Club
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2011
    Messages : 7
    Par défaut
    Merci pour ton aide et ta patience !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/12/2013, 18h10
  2. Réponses: 1
    Dernier message: 23/07/2013, 13h03
  3. Comment utiliser le caractère ● comme Passwordchar?
    Par z4k4r14 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2012, 10h33
  4. Utiliser le nombre de caractères comme unité de mesure
    Par mmz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 25/05/2006, 12h52
  5. Réponses: 3
    Dernier message: 11/11/2005, 11h59

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